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