2014-07-19 3 views
1

Tout d'abord, merci de prendre le temps de lire ceci. J'essaie de répondre à quelques questions sur mysql et je suis coincé sur quelques-uns et c'est pourquoi je décide de demander de l'aide si possible. Ou au moins me pointer dans la bonne direction. Toute aide sera très appréciée.Mysql Performance Query

La table urbaine contient des données sur la population de 4000 villes dans 230 pays. Expliquez pourquoi la requête suivante fonctionne mal dans MySQL 5.6 et démontrez des solutions.

SELECT `ID`, `CountryCode`, `Name`, `District`, `Population` 
FROM `City` 
WHERE (`CountryCode`, `Population`) IN (
    SELECT `CountryCode`, MAX(`Population`) AS `Population` 
    FROM `City` 
    GROUP BY `CountryCode` 
); 
+0

Quels indices existent sur la table CITY? –

+0

aucun Pieter Geerkens. – user2820879

Répondre

1

Vous penserait cette requête exécute uniquement la sous-requête une fois, conserve le résultat, et compare ensuite à des lignes dans la requête externe. Mais ce n'est pas le cas avec MySQL. MySQL a une lacune dans l'intelligence de son optimiseur, donc il traite 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 la forme d'une table temporaire interne. Puis rejoignez 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`); 

Aussi, vous devriez avoir un index sur la ville au cours des deux colonnes (CountryCode,Population) dans cet ordre, de sorte que le GROUP BY requête peut fonctionner efficacement.

+0

Merci Bill Karwin. Je vais prendre vos suggestions et les reproduire pour vérifier les améliorations. – user2820879

+0

Bonne chance! Faites-nous savoir si cela aide. –

+0

Ça aide vraiment! Encore une fois merci Bill Karwin. – user2820879