Nie trać czasu na profilowanie. Czas jest zawsze w operacjach na bazie danych. Rób jak najmniej. Tylko minimalna liczba wkładek.
Trzy rzeczy.
Jeden. Nie WYBIERZ w kółko, aby dostosować wymiary Data, Nazwa hosta i Osoba. Pobierz wszystkie dane RAZ do słownika Pythona i użyj ich w pamięci. Nie rób powtarzających się wyborów singletonowych. Użyj Pythona.
Dwa. Nie aktualizuj.
W szczególności nie rób tego. To zły kod z dwóch powodów.
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
Należy go zastąpić prostym SELECT COUNT(*) FROM ... . Nigdy nie aktualizuj, aby zwiększyć liczbę. Po prostu policz wiersze, które są tam za pomocą instrukcji SELECT. [Jeśli nie możesz tego zrobić za pomocą prostego WYBIERZ LICZBA lub WYBIERZ LICZBA(DISTINCT), brakuje niektórych danych – Twój model danych powinien zawsze zapewniać prawidłowe pełne zliczenia. Nigdy nie aktualizuj.]
I. Nigdy nie buduj SQL używając podstawiania ciągów. Całkowicie głupi.
Jeśli z jakiegoś powodu SELECT COUNT(*)
nie jest wystarczająco szybki (najpierw test, zanim zrobisz cokolwiek kiepskiego), możesz buforować wynik liczenia w innej tabeli. PO wszystkich obciążeniach. Wykonaj SELECT COUNT(*) FROM whatever GROUP BY whatever
i wstaw to do tabeli zliczania. Nie aktualizuj. Kiedykolwiek.
Trzy. Użyj zmiennych wiązania. Zawsze.
cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )
SQL nigdy się nie zmienia. Wartości powiązane zmieniają się, ale SQL nigdy się nie zmienia. To jest DUŻO szybsze. Nigdy nie twórz instrukcji SQL dynamicznie. Nigdy.