Maison >base de données >tutoriel mysql >Comment puis-je interroger efficacement plusieurs colonnes à l'aide de la clause IN de MySQL ?
Interroger plusieurs colonnes dans une clause IN avec MySQL
Lorsque vous travaillez avec des données structurées, interroger plusieurs colonnes dans une clause IN est une opération courante . Cependant, pour MySQL, il existe une distinction subtile entre l'utilisation de la clause IN avec un seul tuple et avec un ensemble de tuples.
Requête de tuple unique :
L'original La question décrit un scénario dans lequel vous disposez de quatre colonnes (x0, y0, x1, y1) représentant les coordonnées géographiques. Pour une seule combinaison de valeurs, telle que (4, 3, 5, 6), vous pouvez utiliser la clause IN comme suit :
SELECT * FROM my_table WHERE (x0, y0, x1, y1) IN ((4, 3, 5, 6))
Avec un index composite sur (x0, y0, x1, y1 ), cette requête localisera efficacement la ligne souhaitée.
Requête de tuples multiples :
Cependant, la question implique également d'interroger une liste de tuples, tels que [(4, 3, 5, 6), (9, 3, 2, 1)]. Dans de tels scénarios, l'optimiseur de MySQL peut ne pas toujours gérer la clause IN de manière optimale.
Amélioration de l'optimiseur dans les nouvelles versions de MySQL :
Dans les versions antérieures de MySQL (avant la version 5.7), l'optimiseur décomposerait la requête à tuples multiples en une série de clauses OR, comme décrit dans le réponse :
( ( x0 = 4 AND y0 = 3 AND x1 = 5 AND y1 = 6 ) OR ( x0 = 9 AND y0 = 3 AND x1 = 2 AND y1 = 1 ) )
Cette approche pourrait conduire à des plans d'exécution inefficaces, en particulier avec de grands ensembles de données.
Dans les versions plus récentes de MySQL (5.7 et supérieures), l'optimiseur a été amélioré pour générer plus plans efficaces pour plusieurs requêtes tuple IN. Pour ces versions, il est recommandé d'utiliser la syntaxe suivante :
(x0, y0, x1, y1) IN ((4, 3, 5, 6), (9, 3, 2, 1))
L'optimiseur générera automatiquement un plan d'exécution optimisé qui exploite l'index disponible.
Conclusion :
Lors de l'interrogation de plusieurs colonnes dans une clause IN avec MySQL, l'approche recommandée dépend de la version de MySQL. Pour les anciennes versions, il est conseillé de décomposer la requête en clauses OR. Pour les versions plus récentes, l'optimiseur amélioré peut gérer efficacement plusieurs requêtes de tuple IN sans avoir besoin d'une restructuration manuelle.
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!