Ускорение большого количества обновлений и вставок mysql

У меня есть приложение, которому необходимо обновить большой объем данных при большом количестве записей. В основном он выполняет около 7000 вставок и / или обновлений, но это занимает очень много времени (например, почти 9 минут ... в среднем около 0,08 секунды на запрос). По сути, я ищу общее ускорение выполнения нескольких таких запросов (я не жду конкретного ответа на мой расплывчатый пример ... который, надеюсь, поможет объяснить).

Вот несколько примеров из профилирования запросы:

SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (timestamp = '2010-10-15T07:30:00-07:00') AND (planet_id = '2010_Gl_581_c')

INSERT INTO `habitable_planets` (`planet_id`, `timestamp`, `weather_air_temp`, `weather_cell_temp`, `weather_irradiance`, `weather_wind_float`, `biolumin_to_date`, `biolumin_detected`, `craft_energy_usage`, `craft_energy_consumed_to_date`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (timestamp = '2010-10-15T07:45:00-07:00') AND (planet_id = '2010_Gl_581_c')

INSERT INTO `habitable_planets` (`planet_id`, `timestamp`, `weather_air_temp`, `weather_cell_temp`, `weather_irradiance`, `weather_wind_float`, `biolumin_to_date`, `biolumin_detected`, `craft_energy_usage`, `craft_energy_consumed_to_date`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Повторить до тошноты (ну примерно 7000 раз). Это обновление, которое собирает данные, генерируемые с интервалами в течение 24 часов, а затем производит массовое обновление базы данных один раз в день. Учитывая ограниченность, которую я показал, есть ли у вас какие-либо предложения по ускорению этого процесса?

Например ... имеет ли смысл, вместо того, чтобы делать выбор для каждой временной метки, сделать один выбор для всего диапазона сразу, а затем перебрать их в скрипте?

Примерно так:

SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (planet_id = '2010_Gl_581_c')

присвоить этот результат $ foo , а затем do:

foreach ($foo as $bar)
{
    if ($bar['timestamp'] == $baz) // where $baz is the needed timestamp
    {
    // do the insert here
    }
}

РЕДАКТИРОВАТЬ: Чтобы добавить немного к этому, одна вещь, которая улучшила отзывчивость в моей ситуации, заключалась в изменении кучи кода, который проверял наличие существующей записи и либо выполнял вставку, либо обновление в зависимости от результата в использование SQL-запроса INSERT ... ON DUPLICATE KEY UPDATE . Это привело к увеличению скорости примерно на 30% в моем конкретном случае, потому что это исключило по крайней мере одно обращение к базе данных из уравнения и более тысячи запросов это действительно складывается.

9
задан rg88 19 October 2010 в 23:07
поделиться