Maison > base de données > tutoriel mysql > le corps du texte

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
Libérer: 2024-10-30 04:10:02
original
1006 Les gens l'ont consulté

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')
Copier après la connexion

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);
Copier après la connexion

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'
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal