Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quels index pour améliorer les performances de JOIN et GROUP BY

Conseil de pro Évitez SELECT * ou SELECT table.* dans les requêtes sensibles aux performances. Sélectionnez plutôt, par nom, les colonnes que vous devez réellement utiliser

Conseil de pro MySQL a une extension notoire non standard pour GROUP BY que vous utilisez, et peut-être abusez-vous. Lis ça. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html Si vous avez suivi le premier conseil de pro, suivre le second serait beaucoup plus facile.

Conseil de pro Évitez de "jeter" beaucoup d'index à une seule colonne dans l'espoir d'accélérer vos requêtes. Au lieu de cela, créez des index, souvent des index composés, correspondant aux besoins de votre requête réelle. Lisez ceci https://use-the-index-luke.com .

Conseil de pro Using temporary; using filesort apparaissant dans la sortie EXPLAIN n'est pas nécessairement mauvais. Cela signifie simplement que le moteur de requête doit mettre en cache un ensemble de résultats partiel avant de le renvoyer. Le temporary chose n'est pas une table réelle, c'est une structure RAM. S'il est si gros qu'il submerge la RAM, MySQL le répandra sur le disque. Mais le vôtre ne l'est pas.

Cela étant dit, refactorisons votre requête. Je suppose que vous voulez récupérer les lignes avec le plus grand idCartDATA valeur pour chaque CartSplitData.SUPPLIERID .

Alors écrivons cela comme une sous-requête.

                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID

Cette requête peut être considérablement accélérée en plaçant un index composé sur CartSplitData :(SUPPLIERID, IDCartDATA) .

Ensuite, réécrivons votre requête principale pour trouver les lignes correspondant aux identifiants dans cette sous-requête.

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'

Votre index sur CartData.CartOrderref aidera cette requête externe, tout comme l'index composé créé ^^^.