Dica profissional Evite
SELECT *
ou SELECT table.*
em consultas sensíveis ao desempenho. Em vez disso, selecione, por nome, as colunas que você realmente precisa usar Dica profissional MySQL tem uma notória extensão não padrão para
GROUP BY
que você está usando, e possivelmente fazendo uso indevido. Leia isso. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
Se você seguisse a primeira dica profissional, seguir a segunda seria muito mais fácil. Dica profissional Evite "jogar" muitos índices de coluna única na esperança de acelerar suas consultas. Em vez disso, crie índices, geralmente índices compostos, que correspondam às necessidades de sua consulta real. Leia isto https://use-the-index-luke.com .
Dica profissional
Using temporary; using filesort
aparecer na saída EXPLAIN não é necessariamente ruim. Significa simplesmente que o mecanismo de consulta precisa armazenar em cache um conjunto de resultados parcial antes de retorná-lo. O temporary
coisa não é uma tabela real, é uma estrutura de RAM. Se for tão grande que inunda a RAM, o MySQL o derramará no disco. Mas o seu não é. Tudo isso dito, vamos refatorar sua consulta. Acho que você deseja recuperar as linhas com o maior
idCartDATA
valor para cada CartSplitData.SUPPLIERID
. Então, vamos escrever isso como uma subconsulta.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Essa consulta pode ser acelerada drasticamente colocando um índice composto em CartSplitData:
(SUPPLIERID, IDCartDATA)
. Em seguida, vamos reescrever sua consulta principal para encontrar as linhas que correspondem aos ids nessa 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'
Seu índice em
CartData.CartOrderref
ajudará esta consulta externa, assim como o índice composto criado ^^^.