Maison > base de données > tutoriel mysql > Pourquoi la condition « IN » de SQL est-elle parfois plus lente que l'opérateur « = » ?

Pourquoi la condition « IN » de SQL est-elle parfois plus lente que l'opérateur « = » ?

Mary-Kate Olsen
Libérer: 2025-01-16 17:13:08
original
154 Les gens l'ont consulté

Why is SQL's `IN` Condition Sometimes Slower Than the `=` Operator?

État IN de SQL : problèmes de performances par rapport à =

Dans des situations spécifiques, la condition IN de SQL peut être considérablement sous-performante par rapport à l'opérateur =. Il s'agissait d'un problème notable dans les anciennes versions de MySQL, bien que les versions ultérieures (MySQL 5.6 et versions ultérieures) l'aient résolu.

La différence de performances provient de défis d'optimisation. Une sous-requête dans une clause IN peut être identifiée à tort comme dépendante, plutôt que comme indépendante. Cela conduit à l'exécution répétée de la sous-requête pour chaque ligne de la requête principale, ce qui a un impact considérable sur les performances.

Regardons un exemple :

<code class="language-sql">SELECT * FROM question_law_version
WHERE question_law_id IN (
    SELECT MAX(foo_id)
    FROM bar
);</code>
Copier après la connexion

Un plan EXPLAIN pour cette requête pourrait révéler :

<code>1  'PRIMARY'             'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
2  'DEPENDENT SUBQUERY'  'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
3  'DEPENDENT SUBQUERY'  'question_law'          'ALL'  ''  ''  ''  ''  10040  'Using where'</code>
Copier après la connexion

Remarquez la désignation "SOUS-REQUÊTE DÉPENDANTE". La requête interne est exécutée à plusieurs reprises. Cependant, réécrire la requête en utilisant = (en supposant que la sous-requête renvoie une seule valeur) :

<code class="language-sql">SELECT * FROM question_law_version
WHERE question_law_id = (
    SELECT MAX(foo_id)
    FROM bar
);</code>
Copier après la connexion

... aboutit souvent à un plan plus efficace :

<code>1  'PRIMARY'   'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
2  'SUBQUERY'  'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
3  'SUBQUERY'  'question_law'          'ALL'  ''  ''  ''  ''  10040  'Using where'</code>
Copier après la connexion

La principale différence est la classification "SOUS-REQUÊTE", indiquant une seule exécution. Cet écart de performances résulte d'une mauvaise interprétation par MySQL (dans les anciennes versions) de la dépendance de sous-requête de la clause IN. La gestion inefficace de la base de données entraîne un ralentissement des performances.

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!

source:php.cn
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