No pierdas el tiempo perfilando. El tiempo siempre está en las operaciones de la base de datos. Haz la menor cantidad posible. Solo el número mínimo de inserciones.
Tres cosas.
Una. No SELECCIONE una y otra vez para ajustar las dimensiones de Fecha, Nombre de host y Persona. Obtenga todos los datos UNA VEZ en un diccionario de Python y utilícelos en la memoria. No haga selecciones singleton repetidas. Usa Python.
Dos. No actualizar.
Específicamente, no hagas esto. Es un código incorrecto por dos razones.
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
Se reemplazará con un simple SELECT COUNT(*) FROM ... . Nunca actualice para incrementar un conteo. Simplemente cuente las filas que están allí con una instrucción SELECT. [Si no puede hacer esto con un simple SELECT COUNT o SELECT COUNT(DISTINCT), le faltan algunos datos; su modelo de datos siempre debe proporcionar recuentos completos correctos. Nunca actualizar.]
Y. Nunca construyas SQL usando sustitución de cadenas. Completamente tonto.
Si, por alguna razón, SELECT COUNT(*)
no es lo suficientemente rápido (primero el punto de referencia, antes de hacer algo tonto), puede almacenar en caché el resultado del conteo en otra tabla. DESPUÉS de todas las cargas. Haz SELECT COUNT(*) FROM whatever GROUP BY whatever
e inserte esto en una tabla de conteos. No Actualizar. Nunca.
Tres. Utilice variables de vinculación. Siempre.
cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )
El SQL nunca cambia. Los valores enlazados cambian, pero el SQL nunca cambia. Esto es MUCHO más rápido. Nunca construya sentencias SQL dinámicamente. Nunca.