Maison  >  Article  >  base de données  >  Pourquoi l'utilisation de \'IN\' avec une sous-requête ralentit-elle les requêtes MySQL, mais pas lors de l'utilisation de valeurs explicites ?

Pourquoi l'utilisation de \'IN\' avec une sous-requête ralentit-elle les requêtes MySQL, mais pas lors de l'utilisation de valeurs explicites ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 04:10:02997parcourir

Why does using

Requêtes MySQL lentes avec "IN" par rapport aux valeurs explicites

Dans MySQL, l'opérateur "IN" peut provoquer une dégradation significative des performances lorsqu'il est accompagné par une sous-requête, bien qu'elle s'exécute rapidement avec des valeurs explicites.

Problème

Considérez la requête MySQL suivante :

SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')

Malgré la sous-requête et Pour l'indexation des colonnes, cette requête prend environ 18 secondes à s'exécuter. Cependant, le remplacement des résultats de la sous-requête par des valeurs explicites accélère considérablement la requête, qui se termine en moins d'une milliseconde :

SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (24899,24900,24901,24902);

Raisonnement

La disparité des performances provient de la sous-requête comportement. Dans MySQL, les sous-requêtes sont évaluées à chaque fois qu'elles sont référencées. Ainsi, la requête d'origine exécute la sous-requête environ 7 millions de fois, ce qui entraîne un ralentissement des performances.

Solution

Pour résoudre ce problème, envisagez d'utiliser une JOIN au lieu d'une sous-requête. :

SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
INNER JOIN em_link l
ON em_link_data.linkid = l.id
WHERE
l.campaignid = '2900' AND l.link != 'open'

Cette approche exécute une seule requête, améliorant considérablement 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