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