Probleme mit Temporary und Filesort in MySQL: Eine Schema- und Abfrageanalyse
In einem Ereignisverfolgungssystem mit Nachschlagetabellen und einer Protokollierungstabelle, Bei einer Abfrage, die Objektstatistiken in absteigender Reihenfolge ihrer Wichtigkeit anzeigen soll, tritt ein Problem auf. Während die Abfrage mit einer kleinen Anzahl von Einträgen ordnungsgemäß funktioniert, weisen ihre EXPLAIN-Ergebnisse auf Optimierungspotenzial hin.
Die betreffende Abfrage verwendet einen linken Join zwischen den Tabellen „event_log“ und „lookup_event_objects“, wobei die Ergebnisse nach „object_id“ gruppiert und nach „count_rows“ sortiert werden absteigender Reihenfolge, gefolgt von object_desc in aufsteigender Reihenfolge. Diese Abfrage generiert jedoch Warnungen zur Verwendung einer temporären Tabelle und Dateisortierung.
MySQL verwendet temporäre Tabellen, wenn die Abfrage eine andere ORDER BY-Klausel als die GROUP BY-Klausel enthält oder wenn auf die Sortierung oder Gruppierung von anderen Tabellen als verwiesen wird der erste im Join. In diesem Fall basiert die Sortierung auf einem berechneten Feld, was die Indexverwendung unmöglich macht, daher die Verwendung von Dateisortierung.
Um das Problem zu beheben, entfernen Sie die ORDER BY-Klausel für leo.object_desc. Dadurch entfällt die Notwendigkeit temporärer Tabellen und Dateisortierungen, was die Abfrageleistung verbessert:
<code class="sql">EXPLAIN SELECT el.object_id, leo.object_desc, COUNT(el.object_id) as count_rows FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id ORDER BY count_rows DESC;</code>
Das obige ist der detaillierte Inhalt vonWarum verursacht meine MySQL-Abfrage temporäre Tabellen und Dateisortierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!