sql >> Base de Datos >  >> RDS >> Mysql

Índice MySQL para Agrupar por / Ordenar por

Esto debería ayudarte. Vuelva a escribir su consulta de la siguiente manera:

SELECT c1, Sum(c2) 
FROM table 
WHERE c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11)
AND c3 IS NOT NULL   
GROUP BY c1

Ahora cree un índice compuesto en las columnas (c4, c5, c6) con las columnas EN ESE ORDEN. Las columnas de su índice deben aparecer en el mismo orden que las columnas de su cláusula WHERE. De lo contrario, el índice no funcionará. La selectividad de este índice es lo suficientemente estrecha como para que una ordenación de archivos en la tabla temporal (para el grupo por) sea rápida.

La razón para mover c3 al final de la consulta es la siguiente. Como ejemplo, supongamos que c3 puede tomar valores entre 0 y 100 (o puede ser NULL). Si ejecuta una consulta "NO ES NULO", entonces Mysql necesita atravesar casi todo el índice B-Tree excepto los bordes que corresponden a NULL. Por lo tanto, MySQL decide que un escaneo completo de la tabla es una opción más fácil que recorrer todas las rutas diferentes en el índice. Por otro lado, verá que si su consulta fue "IS NULL" y su índice fue (c3, c4, c5, c6), Mysql de hecho usará este índice. Esto se debe a que, en este caso, Mysql solo necesita recorrer la parte del árbol de índice correspondiente al valor NULL.

El tipo de índices que necesita MySQL depende en gran medida de la consulta en cuestión. ¡Crear índices en todas las columnas, como sugirió @louis, NO es una buena idea!