Exception de performances des requêtes MySQL : différence de performances entre l'opérateur IN et l'opérateur de signe égal
Description du problème
Dans MySQL, les performances d'une requête SELECT utilisant la condition IN sont nettement inférieures à celles de la même requête utilisant l'opérateur de signe égal (=). Même si la condition IN ne contient qu’une seule valeur, la différence de performances peut être significative.
Explication
Ce problème provient d'une faille d'optimisation dans MySQL qui a été corrigée dans MySQL 5.6.x. Ce problème se produit lorsqu’une sous-requête contenant une condition IN est classée à tort comme sous-requête dépendante plutôt que comme sous-requête indépendante.
Sous-requête dépendante et sous-requête indépendante
Exemple d'analyse de requête
L'exemple de requête suivant illustre cette anomalie :
<code class="language-sql">SELECT * FROM question_law_version WHERE id IN ( SELECT MAX(foo_id) FROM bar )</code>
Lors de l'exécution de cette requête, la sous-requête est traitée comme une sous-requête dépendante, ce qui entraîne de mauvaises performances. Cependant, remplacer IN par = supprime la dépendance et améliore considérablement les performances.
Comparaison des plans de requête
L'inspection du plan de requête à l'aide de la commande EXPLAIN révèle la différence :
Veuillez noter qu'il n'y a pas de « SOUS-REQUÊTE DÉPENDANTE » dans le plan de requête utilisant l'opérateur =.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!