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

Pourquoi une requête MySQL \'IN\' avec une sous-requête est-elle significativement plus lente qu'avec des valeurs explicites ?

Barbara Streisand
Libérer: 2024-10-31 02:09:02
original
627 Les gens l'ont consulté

 Why is a MySQL

Écart de performances entre les sous-requêtes et les requêtes à valeur explicite "IN"

Pourquoi une requête MySQL "IN" est-elle significativement plus lente lors de l'utilisation d'une sous-requête que lorsque vous utilisez des valeurs explicites ?

Considérez la requête suivante :

<code class="sql">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')</code>
Copier après la connexion

Cette requête prend environ 18 secondes à s'exécuter, malgré le fait que la sous-requête à elle seule se termine en moins de 1 ms.

Cependant, lorsque la sous-requête est remplacée par des valeurs explicites :

<code class="sql">SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid IN (24899,24900,24901,24902);</code>
Copier après la connexion

La requête se termine en moins d'1 milliseconde.

Explication

L'écart de performances provient de la manière dont MySQL évalue les sous-requêtes. Les sous-requêtes sont exécutées à chaque fois qu'elles sont rencontrées, ce qui signifie que dans la première requête, MySQL exécute essentiellement sept millions de requêtes (évaluation de la sous-requête pour chaque ligne de la table "em_link_data"). En revanche, lors de l'utilisation de valeurs explicites, la sous-requête n'est évaluée qu'une seule fois.

Solution de contournement

Si la réécriture de la requête à l'aide d'un JOIN n'est pas une option, vous pouvez envisager d'utiliser un cache de requêtes pour améliorer les performances. Le cache de requêtes stocke les résultats des requêtes précédemment exécutées et les réutilise si la même requête est à nouveau exécutée. Cela peut réduire considérablement le temps d'exécution des requêtes gourmandes en sous-requêtes.

Pour activer le cache de requêtes, ajoutez la ligne suivante à votre fichier de configuration MySQL :

query_cache_type = 1
Copier après la connexion

Redémarrez MySQL pour les modifications apportées prendre effet.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!