Maison >base de données >tutoriel mysql >Pourquoi l'opérateur « IN » de MySQL est-il plus lent que « = » même avec une seule valeur ?

Pourquoi l'opérateur « IN » de MySQL est-il plus lent que « = » même avec une seule valeur ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-16 17:38:11969parcourir

Why is MySQL's `IN` operator slower than `=` even with a single value?

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

  • Sous-requête dépendante : Pour chaque ligne de la requête externe, la sous-requête dépendante est exécutée une fois, ce qui entraîne plusieurs calculs.
  • Sous-requête indépendante : n'est exécutée qu'une seule fois, quel que soit le nombre de lignes dans la requête externe.

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 :

  • EN Etat :
    • 'PRIMARY' 'question_law_version' 'TOUS' '' '' '' '' 10148 'Utiliser où'
    • 'SOUS-REQUÊTE DÉPENDANTE' 'question_law_version' 'TOUS' '' '' '' '' 10148 'Utilisation de où'
    • 'SOUS-REQUÊTE DÉPENDANTE' 'question_law' 'TOUS' '' '' '' '' 10040 'Utilisation de où'
  • Condition de signe égal :
    • 'PRIMARY' 'question_law_version' 'TOUS' '' '' '' '' 10148 'Utiliser où'
    • 'SUBQUERY' 'question_law_version' 'TOUS' '' '' '' '' 10148 'Utilisation de où'
    • 'SOUS-REQUÊTE' 'question_law' 'TOUS' '' '' '' '' 10040 'Utilisation de où'

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn