Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête de performances MySQL

On pourrait penser que cette requête n'exécute la sous-requête qu'une seule fois, conserve le résultat, puis le compare aux lignes de la requête externe. Mais ce n'est pas le cas avec MySQL. MySQL a une lacune dans l'intelligence de son optimiseur, il traite donc la sous-requête comme une sous-requête dépendante et la réexécute pour chaque valeur distincte de la requête externe.

Pour résoudre ce problème, déplacez la sous-requête dans la clause FROM en tant que table dérivée. Il exécutera la sous-requête une fois et conservera le résultat sous forme de table temporaire interne. Joignez-vous ensuite à l'autre instance de la table.

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`);

Vous devriez également avoir un index sur City sur les deux colonnes (CountryCode,Population) dans cet ordre, afin que la requête GROUP BY puisse s'exécuter efficacement.