Use Cases
    Capacidades
    Roles

Una lección sobre indexación en MySql

Optmyzr

Manas Garg

Manas Garg

LinkedIn

Co-founder

-
Optmyzr

Entonces tenemos esta tabla que tiene más de 20 millones de filas de datos, almacenando estadísticas. La estructura general de la tabla es así:

ItemId (varchar) | GroupID (varchar) | Stat1 (float) | Stat2 (float) | … StatN

Hay un índice en ItemId + GroupId. Al realizar consultas, observé que tardaban mucho, mucho tiempo – hasta 100 segundos. Las consultas eran simples y se veían así:

SELECT * FROM TABLE WHERE ItemId=123456789 AND GroupId=987654321

Después de romperme la cabeza con diferentes particionamientos, estilos de consulta, casi había decidido que necesitaba actualizar el servidor (después de todo, era una instancia micro en Amazon EC2, y la CPU solía dispararse cuando se emitía la consulta).

Entonces se me ocurrió. Cambié la consulta a esto, ¡y los tiempos de consulta bajaron a 0.2 segundos!

SELECT * FROM TABLE WHERE ItemId=’123456789’ AND GroupId=’987654321’

¿Lo entiendes? Las columnas son varchar, pero los parámetros que estaba suministrando eran ints, y eso causaría una conversión manual de tipo de cada valor (más de 40 millones de valores), y luego una búsqueda no indexada. No es de extrañar que fuera tan lento.

Uno de esos días 🙂 Aunque creo que el optimizador de consultas probablemente debería intentar convertir el tipo del parámetro en lugar de las columnas de la tabla.

Compartir en: