Warum MySQL Temporär und Filesort in dieser Abfrage verwendet
Ihre Abfrage zum Extrahieren von Objektstatistiken aus den Tabellen „event_log“ und „lookup_event_objects“ weist einen Leistungsengpass auf. wie durch die EXPLAIN-Ausgabe „Using index; Using temporary; Using filesort“ angezeigt. Hier ist der Grund:
Temporäre Tabellen
MySQL verwendet temporäre Tabellen, wenn eine Nichtübereinstimmung zwischen den ORDER BY- und GROUP BY-Klauseln besteht oder wenn die Sortier- oder Gruppierungsspalten zu nicht gehören -verbundene Tabellen. In diesem Fall leidet Ihre Abfrage unter der ersten Bedingung, da sich die ORDER BY-Klausel (count_rows DESC, leo.object_desc ASC) von der GROUP BY-Klausel (el.object_id) unterscheidet.
Filesort
„Filesort verwenden“ zeigt an, dass MySQL die in der ORDER BY-Klausel angegebene Sortierung nicht mithilfe eines Index durchführen kann. Da Sie nach einem berechneten Feld (count_rows) sortieren, muss die Datenbank einen vollständigen Tabellenscan durchführen und die Ergebnisse sortieren.
Mögliche Lösung
Wie in vorgeschlagen Gemäß der bereitgestellten Antwort besteht die Lösung darin, die Diskrepanz zwischen den Klauseln ORDER BY und GROUP BY zu beseitigen. Sie könnten den count_rows-Alias durch die eigentliche Zähloperation innerhalb der GROUP BY-Klausel ersetzen:
SELECT el.object_id, leo.object_desc, COUNT(el.object_id) AS count FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id, count ORDER BY count DESC, leo.object_desc ASC;
Dadurch entfällt die Notwendigkeit temporärer Tabellen und Dateisortierungen, was möglicherweise die Leistung der Abfrage verbessert.
Das obige ist der detaillierte Inhalt vonWarum verwendet meine Abfrage temporäre Tabellen und Filesort?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!