Maison >base de données >tutoriel mysql >Pourquoi `IN` est-il plus lent que `=` dans les sous-requêtes MySQL ?

Pourquoi `IN` est-il plus lent que `=` dans les sous-requêtes MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-16 17:18:12384parcourir

Why is `IN` slower than `=` in MySQL subqueries?

La raison pour laquelle l'opérateur IN est plus lent que l'opérateur = dans MySQL

Dans certains cas, les conditions IN dans MySQL s'exécutent plus lentement que les conditions =. Il s'agit d'un problème connu. La cause première est que lorsque l'optimiseur MySQL traite les sous-requêtes dans des conditions IN, il les identifie parfois par erreur comme des sous-requêtes dépendantes au lieu de sous-requêtes indépendantes.

Ainsi, la sous-requête dans la condition IN est exécutée une fois pour chaque ligne de la requête parent, tandis que la sous-requête dans la condition = n'est exécutée qu'une seule fois. Cela peut entraîner des différences de performances significatives, en particulier lorsque vous travaillez avec de grands ensembles de données.

Regardons un exemple de requête SELECT :

<code class="language-sql">SELECT *
FROM question_law_version
WHERE law_version IN (SELECT MAX(foo_id) FROM bar);</code>

En utilisant EXPLAIN pour analyser cette requête, les résultats pourraient ressembler à ceci :

<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>
La ligne

"DEPENDENT SUBQUERY" indique que la sous-requête dans la condition IN est en cours d'exécution pour chaque ligne de la requête parent.

Si on change la condition IN en = :

<code class="language-sql">SELECT *
FROM question_law_version
WHERE law_version = (SELECT MAX(foo_id) FROM bar);</code>
La sortie de

EXPLAIN deviendra :

<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 ligne "SUBQUERY" indique que la sous-requête n'est désormais exécutée qu'une seule fois, ce qui entraîne une exécution plus rapide.

Ce problème a été résolu dans la version MySQL 5.6.x. Si possible, la mise à niveau vers une version plus récente de MySQL peut résoudre ce problème et améliorer les 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