Не губете време за профилиране. Времето винаги е в операциите на базата данни. Правете възможно най-малко. Само минималния брой вмъквания.
Три неща.
един. Не ИЗБИРАЙТЕ отново и отново, за да съответствате на измеренията Дата, Име на хост и Лице. Извлечете всички данни ВЕДНЪЖ в речник на Python и ги използвайте в паметта. Не правете повтарящи се сингълтън селекции. Използвайте Python.
две. Не актуализирай.
По-конкретно, не правете това. Това е лош код по две причини.
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
Той може да бъде заменен с обикновен SELECT COUNT(*) FROM ... . Никога не актуализирайте, за да увеличите броя. Просто пребройте редовете, които са там, с оператор SELECT. [Ако не можете да направите това с обикновен SELECT COUNT или SELECT COUNT(DISTINCT), ви липсват някои данни -- вашият модел на данни трябва винаги да предоставя правилни пълни преброявания. Никога не актуализирайте.]
И. Никога не създавайте SQL чрез заместване на низове. Напълно тъпо.
Ако по някаква причина SELECT COUNT(*)
не е достатъчно бърз (първо бенчмарк, преди да направите нещо куцо) можете да кеширате резултата от преброяването в друга таблица. СЛЕД всички натоварвания. Направете SELECT COUNT(*) FROM whatever GROUP BY whatever
и вмъкнете това в таблица с преброявания. Не актуализирайте. Някога.
Три. Използвайте свързващи променливи. Винаги.
cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )
SQL никога не се променя. Обвързаните стойности се променят, но SQL никога не се променя. Това е МНОГО по-бързо. Никога не създавайте SQL изрази динамично. Никога.