Profi-Tipp Vermeiden Sie SELECT *
oder SELECT table.*
in leistungsabhängigen Abfragen. Wählen Sie stattdessen nach Namen die Spalten aus, die Sie tatsächlich verwenden müssen
Profi-Tipp MySQL hat eine notorische Nicht-Standard-Erweiterung für GROUP BY
die Sie verwenden und möglicherweise missbrauchen. Lesen Sie dies. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
Wenn Sie den ersten Profi-Tipp befolgt hätten, wäre es viel einfacher, dem zweiten zu folgen.
Profi-Tipp Vermeiden Sie es, viele Einzelspalten-Indizes "einzuwerfen", in der Hoffnung, Ihre Abfragen zu beschleunigen. Erstellen Sie stattdessen Indizes, häufig zusammengesetzte Indizes, die den Anforderungen Ihrer tatsächlichen Abfrage entsprechen. Lesen Sie diesen https://use-the-index-luke.com .
Profi-Tipp Using temporary; using filesort
in der EXPLAIN-Ausgabe erscheint, ist nicht unbedingt schlecht. Es bedeutet einfach, dass die Abfrage-Engine eine Teilergebnismenge zwischenspeichern muss, bevor sie sie zurückgibt. Die temporary
Das Ding ist keine tatsächliche Tabelle, sondern eine RAM-Struktur. Wenn es so groß ist, dass es RAM überschwemmt, wird MySQL es auf die Festplatte übertragen. Aber Ihres ist es nicht.
Abgesehen davon, lassen Sie uns Ihre Abfrage umgestalten. Ich denke, Sie möchten die Zeilen mit den größten idCartDATA
abrufen Wert für jede CartSplitData.SUPPLIERID
.
Schreiben wir das also als Unterabfrage.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Diese Abfrage kann drastisch beschleunigt werden, indem CartSplitData ein zusammengesetzter Index hinzugefügt wird:(SUPPLIERID, IDCartDATA)
.
Als Nächstes schreiben wir Ihre Hauptabfrage neu, um die Zeilen zu finden, die mit den IDs in dieser Unterabfrage übereinstimmen.
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'
Ihr Index auf CartData.CartOrderref
wird dieser äußeren Abfrage helfen, ebenso wie der zusammengesetzte Index, der ^^^.