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