sql >> Base de Datos >  >> RDS >> Mysql

Qué índices para mejorar el rendimiento de JOIN y GROUP BY

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