La séquence de conditions dans une clause MySQL WHERE a-t-elle un impact sur les performances ?
Dans les requêtes MySQL avec des clauses WHERE étendues et de nombreuses conditions, c'est crucial pour optimiser les performances. Supposons qu’une condition spécifique, telle qu’un identifiant d’entreprise, réduise considérablement l’espace de recherche de centaines de milliers à des dizaines. Cette condition doit-elle être positionnée en premier dans la clause ?
Considérons deux versions d'une requête qui recherche des clients correspondant à certains paramètres :
SELECT * FROM clients WHERE (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) AND company = :ugh
SELECT * FROM clients WHERE company = :ugh AND (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar)
Impact sur les performances
Traditionnellement, on pensait que l'ordre des conditions avait un impact minime, voire nul, sur les performances de MySQL. Cependant, des tests et des informations récents ont révélé que dans certains scénarios, cela peut effectivement faire une différence.
Court-circuit et ordre des conditions
Le facteur clé est le court-circuit. -circuitage. Dans MySQL, lors de l'évaluation de conditions composées connectées par AND ou OR, le moteur de base de données peut évaluer le premier opérande uniquement si la condition est pertinente. Cette optimisation peut faire gagner un temps considérable si la première condition réduit considérablement l'espace de recherche.
Démonstration
Pour illustrer cet effet, considérons les requêtes suivantes :
-- query #1 SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1; -- query #2 SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;
La seule différence est l'ordre des opérandes dans la condition OU. myslowfunction est une fonction délibérément coûteuse qui inclut l'effet secondaire de journaliser chaque invocation.
Lorsque ces requêtes sont exécutées :
myslowfunction called for query #1 with value 1 myslowfunction called for query #1 with value 2 myslowfunction called for query #2 with value 1 myslowfunction called for query #2 with value 2 myslowfunction called for query #2 with value 3 myslowfunction called for query #2 with value 4
Comme le montre la trace, myslowfunction est appelée moins de fois pour la requête #1 car la première condition (myint >= 3) élimine de nombreuses lignes qui ne la satisfont pas. Placer cette condition en premier permet une résiliation anticipée et évite une évaluation inutile de la fonction lente.
Conclusion
Par conséquent, la réponse à la question est : Oui, l'ordre des conditions dans une clause WHERE peut parfois affecter les performances de MySQL en raison d'un court-circuit. En plaçant des conditions restrictives en premier, les moteurs de base de données peuvent optimiser l'exécution des requêtes en évitant les traitements inutiles et en maximisant l'efficacité.
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!