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

Korrekte Indizierung durch Join-Where-Group By Select-Abfragen Vermeidung der Verwendung von temporären; Filesort verwenden

Ich würde die Abfrage so schreiben:

SELECT c.time
     , SUM(c.counter)
     , MAX(p.clustername) AS clustername
  FROM cell c

  JOIN swap_plan p
    ON p.siteid      = c.siteid
   AND p.clustername = 'Cluster A'

 WHERE c.time  >=  'day1'
   AND c.time  <=  'day2'
 GROUP
    BY c.time

Ich würde sicher sein, einen Index für cell zu haben mit time als führende Spalte.

MySQL kann denselben Index verwenden, um das Bereichsprädikat (in der WHERE-Klausel) und das GROUP BY ohne eine "Using filesort"-Operation zu erfüllen.

... ON cell (time)

Abhängig von der Größe der Spalten kann ein abdeckender Index eine optimale Leistung bieten. Ein abdeckender Index enthält alle Spalten aus der Tabelle, auf die in der Abfrage verwiesen wird, sodass die Abfrage vollständig von den Indexseiten aus erfüllt werden kann, ohne nach Seiten in der zugrunde liegenden Tabelle zu suchen.

... ON cell (time, siteid, counter)

Für den Index auf swap_plan , hätte ich einen Index mit site_id als führende Spalte und einschließlich clustername Spalte, entweder:

... ON swap_plan (clustername, site_id)

oder

... ON swap_plan (site_id, clustername)

Es sieht wahrscheinlich so aus, als ob es eine UNIQUE-Einschränkung für die Kombination dieser beiden Spalten geben wird, d. h. die Werte von site_id wird für einen bestimmten clustername unterschiedlich sein . (Wenn das nicht der Fall ist, und dasselbe (site_id,clustername) Wenn das Tupel mehrmals erscheint, besteht die Möglichkeit, dass die Summe von counter aggregiert wird aufgeblasen werden.

Ich würde nach dem EXPLAIN suchen Ausgabe, um eine 'ref'-Suche nach swap_plan anzuzeigen Tabelle aus dem Wert von c.siteid und konstanter (literaler 'Cluster A') Wert für Clustername.

Bei Tabellen mit einer Größe von 31 Zeilen und 368 Zeilen werden wir keinen signifikanten Unterschied in der Leistung (verstrichene Zeit) zwischen einem optimalen Ausführungsplan und einem schrecklichen Ausführungsplan feststellen.

Wenn eine der Tabellen auf Millionen von Zeilen skaliert wird, werden die Unterschiede deutlich. Die Wahl des Ausführungsplans durch den Optimierer wird durch Statistiken (Größe, Anzahl der Zeilen, Spaltenkardinalität) jeder Tabelle beeinflusst, sodass sich der Ausführungsplan mit einer Erhöhung der Tabellengröße ändern kann.