Consejo profesional Evite SELECT *
o SELECT table.*
en consultas sensibles al rendimiento. En su lugar, seleccione, por nombre, las columnas que realmente necesita usar
Consejo profesional MySQL tiene una notoria extensión no estándar para GROUP BY
que está usando, y posiblemente haciendo un mal uso. Lee esto. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
Si siguió el primer consejo profesional, seguir el segundo sería mucho más fácil.
Consejo profesional Evite "arrojar" muchos índices de una sola columna con la esperanza de acelerar sus consultas. En su lugar, cree índices, a menudo índices compuestos, que coincidan con las necesidades de su consulta real. Lee esto https://use-the-index-luke.com .
Consejo profesional Using temporary; using filesort
que aparece en la salida EXPLAIN no es necesariamente malo. Simplemente significa que el motor de consulta tiene que almacenar en caché un conjunto de resultados parcial antes de devolverlo. El temporary
la cosa no es una tabla real, es una estructura RAM. Si es tan grande que inunda la memoria RAM, MySQL lo derramará en el disco. Pero el tuyo no lo es.
Habiendo dicho todo eso, refactoricemos su consulta. Supongo que desea recuperar las filas con el mayor idCartDATA
valor para cada CartSplitData.SUPPLIERID
.
Así que escribamos eso como una subconsulta.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Esta consulta se puede acelerar drásticamente al colocar un índice compuesto en CartSplitData:(SUPPLIERID, IDCartDATA)
.
A continuación, reescribamos su consulta principal para encontrar las filas que coincidan con los identificadores en esa subconsulta.
SELECT CartData.* /* * hammers performance */
CartSplitData.* /* * hammers performance */
FROM CartData
JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
JOIN (
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
)x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
AND x.IDCartData = CartSplitData.IDCartData
WHERE CartData.CartOrderref = 'XXXXXXXXX'
Su índice en CartData.CartOrderref
ayudará a esta consulta externa, al igual que el índice compuesto creado ^^^.