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
Mary-Kate Olsenoriginal
2025-01-16 17:13:08215parcourir

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>

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>

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>

... 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>

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!

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