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

MySQL-Leistungsabfrage

Sie würden denken, dass diese Abfrage die Unterabfrage nur einmal ausführt, das Ergebnis behält und es dann mit Zeilen in der äußeren Abfrage vergleicht. Aber das ist bei MySQL nicht der Fall. MySQL hat eine Lücke in der Intelligenz seines Optimierers, daher behandelt es die Unterabfrage als abhängige Unterabfrage und führt es für jeden unterschiedlichen Wert der äußeren Abfrage erneut aus.

Um dies zu beheben, verschieben Sie die Unterabfrage als abgeleitete Tabelle in die FROM-Klausel. Es führt die Unterabfrage einmal aus und behält das Ergebnis als interne temporäre Tabelle. Verbinden Sie sich dann mit der anderen Instanz der Tabelle.

SELECT `ID`, `CountryCode`, `Name`, `District`, `Population`
FROM `City`
JOIN (
    SELECT `CountryCode`, MAX(`Population`) AS `Population`
    FROM `City`
    GROUP BY `CountryCode`
) AS _max USING (`CountryCode`, `Population`);

Außerdem sollten Sie einen Index für die Stadt über den beiden Spalten (CountryCode,Population) haben in dieser Reihenfolge, damit die GROUP BY-Abfrage effizient ausgeführt werden kann.