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
Libérer: 2025-01-16 17:38:11
original
1030 Les gens l'ont consulté

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 :

SELECT *
FROM question_law_version
WHERE id IN (
    SELECT MAX(foo_id)
    FROM bar
)
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal