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