Non perdere tempo a profilare. L'ora è sempre nelle operazioni del database. Fai il meno possibile. Solo il numero minimo di inserti.
Tre cose.
Uno. Non SELEZIONARE più e più volte per conformarsi alle dimensioni Data, Nome host e Persona. Recupera tutti i dati UNA VOLTA in un dizionario Python e usalo in memoria. Non eseguire selezioni singleton ripetute. Usa Python.
Due. Non aggiornare.
In particolare, non farlo. È un codice errato per due motivi.
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
Può essere sostituito con un semplice SELECT COUNT(*) FROM ... . Non aggiornare mai per incrementare un conteggio. Basta contare le righe che ci sono con un'istruzione SELECT. [Se non puoi farlo con un semplice SELECT COUNT o SELECT COUNT(DISTINCT), ti mancano alcuni dati:il tuo modello di dati dovrebbe sempre fornire conteggi completi corretti. Non aggiornare mai.]
E. Non compilare mai SQL utilizzando la sostituzione di stringhe. Completamente stupido.
Se, per qualche motivo, il SELECT COUNT(*)
non è abbastanza veloce (benchmark prima, prima di fare qualsiasi cosa zoppa) puoi memorizzare nella cache il risultato del conteggio in un'altra tabella. DOPO tutti i carichi. Fai un SELECT COUNT(*) FROM whatever GROUP BY whatever
e inserirlo in una tabella di conteggi. Non aggiornare. Mai.
Tre. Usa le variabili di associazione. Sempre.
cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )
L'SQL non cambia mai. I valori vincolati cambiano, ma l'SQL non cambia mai. Questo è MOLTO più veloce. Non creare mai istruzioni SQL in modo dinamico. Mai.