Não perca tempo criando perfis. A hora está sempre nas operações do banco de dados. Faça o mínimo possível. Apenas o número mínimo de inserções.
Três coisas.
Um. Não SELECIONE repetidamente para conformar as dimensões Data, Nome do host e Pessoa. Busque todos os dados UMA VEZ em um dicionário Python e use-o na memória. Não faça seleções singleton repetidas. Use o Python.
Dois. Não atualize.
Especificamente, não faça isso. É um código ruim por dois motivos.
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
Ele deve ser substituído por um simples SELECT COUNT(*) FROM ... . Nunca atualize para incrementar uma contagem. Basta contar as linhas que estão lá com uma instrução SELECT. [Se você não pode fazer isso com um simples SELECT COUNT ou SELECT COUNT(DISTINCT), alguns dados estão faltando -- seu modelo de dados deve sempre fornecer contagens completas corretas. Nunca atualize.]
E. Nunca construa SQL usando substituição de string. Completamente burro.
Se, por algum motivo, o
SELECT COUNT(*)
não for rápido o suficiente (benchmark primeiro, antes de fazer qualquer coisa ruim), você pode armazenar em cache o resultado da contagem em outra tabela. DEPOIS de todas as cargas. Faça um SELECT COUNT(*) FROM whatever GROUP BY whatever
e insira isso em uma tabela de contagens. Não atualize. Sempre. Três. Use variáveis de vinculação. Sempre.
cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )
O SQL nunca muda. Os valores vinculados mudam, mas o SQL nunca muda. Isso é MUITO mais rápido. Nunca crie instruções SQL dinamicamente. Nunca.