Esto debería ayudarlo. Vuelva a escribir su consulta como sigue:
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 en su índice deben aparecer en el mismo orden que las columnas en su cláusula WHERE. De lo contrario, el índice no funcionará. La selectividad de este índice es lo suficientemente estrecha como para que una clasificación de archivos en la tabla temporal (para el grupo por) sea rápida.
El motivo para mover c3 al final de la consulta es el siguiente. Como ejemplo, supongamos que c3 puede tomar valores entre 0 y 100 (o puede ser NULL). Si ejecuta una consulta "IS NOT NULL", Mysql necesita recorrer casi todo el índice B-Tree, excepto los bordes que corresponden a NULL. Por lo tanto, MySQL decide que una exploración de tabla completa es una opción más fácil que recorrer todas las diferentes rutas en el índice. Por otro lado, verá que si su consulta era "IS NULL" y su índice era (c3, c4, c5, c6) entonces Mysql de hecho usará este índice. Esto se debe a que en este caso Mysql solo necesita atravesar 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 @louis sugirió, NO es una buena idea!
Tenga en cuenta que MySQL solo puede usar un índice por tabla, de modo que si coloca un índice en una columna (s) para optimizar el GROUP BY puede terminar lastimándose a sí mismo ya que las cláusulas WHERE no se optimizan y finalmente se ha trabajado más por hacer (es decir, escaneo completo de la tabla). –
Entiendo eso, pero ¿hay alguna forma de crear un único índice que pueda ser utilizado por las cláusulas GROUP BY y WHERE? – bradvido