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.