Tengo una aplicación que necesita actualizar una gran cantidad de datos en un gran número de entradas. Básicamente, realiza unas 7.000 inserciones y/o actualizaciones, pero lleva mucho tiempo (como casi 9 minutos ... con un promedio de aproximadamente 0,08 segundos por consulta). Básicamente, estoy buscando aceleraciones generales para hacer múltiples solicitudes de este tipo (no espero una respuesta específica a mi vago ejemplo ... eso es solo para, afortunadamente, ayudar a explicarlo).Acelerando un gran número de actualizaciones e inserciones de mysql
He aquí algunos ejemplos de perfiles de las solicitudes:
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Repetir hasta la saciedad (así, alrededor de 7.000 veces). Esta es una actualización que recopila los datos generados a intervalos durante un período de 24 horas y luego realiza una actualización masiva de la base de datos una vez al día. Dado el poco tiempo que le he mostrado, ¿hay alguna sugerencia para acelerar este proceso?
Por ejemplo ... ¿tendría sentido, en lugar de hacer una selección para cada marca de tiempo, hacer una selección para un rango de una vez y luego iterar sobre ellas en el script?
vagamente a:
SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (planet_id = '2010_Gl_581_c')
asignar el resultado a $foo
y luego hacer:
foreach ($foo as $bar)
{
if ($bar['timestamp'] == $baz) // where $baz is the needed timestamp
{
// do the insert here
}
}
EDIT: Para añadir un poco de esto, una cosa que ha mejorado la capacidad de respuesta en mi situación era para cambiar un montón de código que comprobó la existencia de un registro existente y, o bien realizó una inserción o una actualización según el resultado en el uso de una consulta INSERT... ON DUPLICATE KEY UPDATE
sql. Esto dio como resultado una ganancia de velocidad de aproximadamente 30% en mi caso particular porque cortó al menos un viaje a la base de datos fuera de la ecuación y sobre miles de solicitudes esto realmente se suma.
+1. Buena respuesta completa. – sberry