Не тратьте время на профилирование. Время всегда в операциях с базой данных. Делайте как можно меньше. Просто минимальное количество вставок.
Три вещи.
One. Не выбирайте снова и снова, чтобы соответствовать измерениям Date, Hostname и Person. Получить все данные ОДИН РАЗ в словарь 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 динамически. Никогда.