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>
"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>
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!