Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Quais índices para melhorar o desempenho de JOIN e GROUP BY


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 ^^^.