Requête efficace MySQL pour plusieurs colonnes dans la clause IN
Votre base de données MySQL comporte quatre colonnes correspondant aux coordonnées géographiques x, y pour le début et position finale. Vous souhaitez effectuer une requête efficace sur ces données, en utilisant une liste d'une centaine de combinaisons de paires géographiques.
L'approche par force brute consisterait à utiliser une clause IN, comme suggéré dans votre réponse Oracle :
SELECT * FROM my_table WHERE (x0, y0, x1, y1) IN ((4, 3, 5, 6), ... ,(9, 3, 2, 1));
Cependant, cette approche n'est pas efficace pour MySQL, surtout avec un grand nombre de lignes.
Pour optimiser la requête, on peut profiter de l'index sur ces quatre colonnes. Nous pouvons réécrire le prédicat IN sous la forme d'une série de conditions OR :
( ( x0 = 4 AND y0 = 3 AND x1 = 5 AND y1 = 6 ) OR ( x0 = 9 AND y0 = 3 AND x1 = 2 AND y1 = 1 ) )
En utilisant des conditions distinctes, nous forçons MySQL à utiliser l'index pour chaque condition, améliorant ainsi considérablement les performances des requêtes.
Remarque pour les versions plus récentes de MySQL
Dans les versions plus récentes de MySQL, l'optimiseur a été amélioré pour générer des plans d'exécution plus efficaces. La syntaxe (a,b) IN ((7,43),(7,44),(8,1)) est prise en charge depuis longtemps, mais les versions antérieures rencontraient des problèmes de performances. Cependant, ces problèmes ont été résolus et les optimiseurs plus récents peuvent utiliser efficacement les index pour les constructions OR.
Conclusion
En utilisant l'approche des conditions OR, vous pouvez améliorer considérablement la efficacité de votre requête MySQL lors de la recherche de plusieurs colonnes dans une clause IN. Cette technique exploite l'index disponible et garantit des performances optimales pour les grands ensembles de données.
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!