Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Welche Indizes zur Verbesserung der Leistung von JOIN und GROUP BY

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

erstellt wird