Neztrácejte čas profilováním. Čas je vždy v databázových operacích. Dělejte co nejméně. Jen minimální počet vložek.
Tři věci.
Jeden. Nevybírejte znovu a znovu, abyste odpovídali dimenzím Datum, Název hostitele a Osoba. Načtěte všechna data JEDNOU do slovníku Pythonu a použijte je v paměti. Neprovádějte opakované výběry. Použijte Python.
Dva. Neaktualizovat.
Konkrétně to nedělejte. Je to špatný kód ze dvou důvodů.
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
Nahradí se jednoduchým SELECT COUNT(*) FROM ... . Nikdy neaktualizujte pro zvýšení počtu. Stačí spočítat řádky, které tam jsou, pomocí příkazu SELECT. [Pokud to nemůžete udělat pomocí jednoduchého SELECT COUNT nebo SELECT COUNT(DISTINCT), chybí vám některá data – váš datový model by měl vždy poskytovat správné úplné počty. Nikdy neaktualizovat.]
A. Nikdy nevytvářejte SQL pomocí substituce řetězců. Úplně hloupý.
Pokud z nějakého důvodu SELECT COUNT(*)
není dostatečně rychlý (nejdříve srovnávejte, než uděláte něco lame), můžete výsledek počítání uložit do mezipaměti v jiné tabulce. PO všech nákladech. Proveďte SELECT COUNT(*) FROM whatever GROUP BY whatever
a vložte to do tabulky počtů. Neaktualizovat. Nikdy.
Tři. Použijte Bind Variables. Vždy.
cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )
SQL se nikdy nemění. Vázané hodnoty se mění, ale SQL se nikdy nemění. Tohle je MNOHEM rychlejší. Nikdy nevytvářejte příkazy SQL dynamicky. Nikdy.