Ho un'app che ha bisogno di aggiornare una grande quantità di dati su un gran numero di voci. Fondamentalmente fa circa 7000 inserti e/o aggiornamenti, ma richiede un tempo molto lungo (come quasi 9 minuti ... in media di circa 0,08 secondi per query). In sostanza, sto cercando accelerazioni generali per fare più richieste di questo tipo (non mi aspetto una risposta specifica al mio vago esempio ... è solo per, si spera, una spiegazione).Accelerare un gran numero di aggiornamenti e inserimenti mysql
Ecco alcuni esempi di profilazione delle richieste:
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Ripetere fino alla nausea (beh, circa 7.000 volte). Questo è un aggiornamento che raccoglie i dati generati a intervalli su un periodo di 24 ore e quindi effettua un massiccio aggiornamento al database una volta al giorno. Visto il limitato bit che ho mostrato, ci sono suggerimenti per accelerare questo processo?
Ad esempio ... avrebbe senso, piuttosto che eseguire una selezione per ciascun timestamp, eseguire una selezione per un intervallo tutto in una volta e quindi scorrere su di essi nello script?
vagamente come:
SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (planet_id = '2010_Gl_581_c')
assegnare che risultano $foo
e poi fare:
foreach ($foo as $bar)
{
if ($bar['timestamp'] == $baz) // where $baz is the needed timestamp
{
// do the insert here
}
}
EDIT: Per aggiungere un po 'per questo, una cosa che ha migliorato la reattività nella mia situazione era per modificare un gruppo di codice che ha verificato la presenza di un record e ha fatto un inserimento o un aggiornamento in base al risultato utilizzando una query sql INSERT... ON DUPLICATE KEY UPDATE
. Ciò ha comportato un aumento della velocità di circa il 30% nel mio caso particolare, in quanto ha eliminato almeno un viaggio nel database dall'equazione e oltre migliaia di richieste che questo aggiunge.
+1. Buona risposta esauriente. – sberry