У меня есть приложение, которому необходимо обновить большой объем данных при большом количестве записей. В основном он выполняет около 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% в моем конкретном случае, потому что это исключило по крайней мере одно обращение к базе данных из уравнения и более тысячи запросов это действительно складывается.