Trabajo con base de datos MySQL (MyISAM).
Tengo una consulta como esta:
select c1, c2, c3, MAX(c5) from T where c4=#string_value# group by c1, c2, c3 - c[1-4] are varchar(255) - c5 is an integerHe probado dos índices:
c1 , c2 , c3 ) - eso hace que la consulta funcione 3 veces más lentac4 ): eso hace que la consulta funcione 5 veces más rápido¿Tal vez hay una manera de crear un índice aún más rápido?
Veo que el siguiente índice es óptimo:
CREATE INDEX idx ON T (c4, c1, c2, c3, c5); El índice comienza con c4 , que aparece en la cláusula WHERE , que es la primera parte de la ejecución de la consulta. A continuación, agregamos c1 , c2 y c3 para cubrir la cláusula GROUP BY . Después de esto, agregamos c5 , lo que hará que MySQL encuentre mucho más rápido MAX(c5) .
Tenga en cuenta que se puede decir que el índice anterior cubre toda la consulta, porque MySQL puede usar el índice solo para satisfacer todo el plan de consulta, sin necesidad de volver a buscar el índice agrupado (tabla).
El mejor índice debe basarse en la condición where...
create index idx1 on T ( c4)para evitar el acceso a la tabla de datos y usar solo la información contenida en el índice, también puede intentar usar un índice redundante agregando la columna involucrada en otras cláusulas
create index idx1 on T ( c4, c1,c2,c3,c5)dejando la columna donde más se fue