Maison > base de données > tutoriel mysql > L'ordre des conditions dans une clause MySQL WHERE affecte-t-il les performances des requêtes ?

L'ordre des conditions dans une clause MySQL WHERE affecte-t-il les performances des requêtes ?

Mary-Kate Olsen
Libérer: 2024-12-25 15:27:14
original
556 Les gens l'ont consulté

Does the Order of Conditions in a MySQL WHERE Clause Affect Query Performance?

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
Copier après la connexion
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) 
Copier après la connexion

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;
Copier après la connexion

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
Copier après la connexion

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!

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