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.