106 votes

Est-ce que l'ajout de 'LIMIT 1' aux requêtes MySQL les rend plus rapides lorsque vous savez qu'il n'y aura qu'un seul résultat ?

Lorsque j'ajoute LIMIT 1 à une requête MySQL, est-ce que cela arrête la recherche après avoir trouvé 1 résultat (rendant ainsi la recherche plus rapide) ou est-ce qu'elle récupère toujours tous les résultats et les tronque à la fin ?

1 votes

Pas s'il y a une contrainte UNIQUE (ou PRIMARY KEY) sur la colonne de filtre. stackoverflow.com/questions/8467092/…

90voto

Eran Galperin Points 49594

En fonction de la requête, l'ajout d'une clause LIMIT peut avoir un impact énorme sur les performances. Si vous ne voulez qu'une seule ligne (ou que vous savez pertinemment qu'une seule ligne peut satisfaire la requête), et que vous n'êtes pas sûr de la façon dont l'optimiseur interne l'exécutera (par exemple, si la clause WHERE ne touche pas un index, etc.), alors vous devriez certainement ajouter une clause LIMIT.

Quant aux requêtes optimisées (utilisant des index sur de petites tables), cela n'aura probablement pas beaucoup d'importance en termes de performances, mais encore une fois - si vous n'êtes intéressé que par une seule ligne, ajoutez une clause LIMIT quand même.

33 votes

À des fins de débogage, vous voudrez peut-être envisager d'envoyer LIMIT 2, puis de vous plaindre ou d'interrompre si votre hypothèse d'une seule ligne n'est pas respectée.

6 votes

@JeffreyHantin S'il ne peut vraiment en rester qu'un, vous devriez préférer ajouter une contrainte d'unicité à la base de données. Beaucoup plus propre que de perturber votre code avec des vérifications de cohérence.

0 votes

@CristianVrabie Si cela peut être exprimé comme une contrainte unique, alors oui, mais il s'agit d'une affirmation concernant les données dans les tables. Envoyer LIMIT 2 et vérifier pour 1 est une affirmation concernant la requête elle-même, qui pourrait bien contenir un bug tel qu'une condition de jointure insuffisamment spécifiée.

22voto

rjamestaylor Points 1610

La limite peut affecter les performances de la requête (voir les commentaires et le lien ci-dessous) et réduit également l'ensemble de résultats renvoyé par MySQL. Pour une requête où vous attendez un seul résultat, il y a des avantages.

De plus, limiter l'ensemble de résultats peut en fait accélérer le temps total de la requête car le transfert de grands ensembles de résultats utilise de la mémoire et crée potentiellement des tables temporaires sur le disque. Je mentionne cela car j'ai récemment vu une application qui n'utilisait pas de limite surcharger un serveur en raison d'ensembles de résultats gigantesques et avec une limite en place, l'utilisation des ressources a considérablement diminué.

Consultez cette page pour plus de détails : Documentation MySQL : Optimisation de LIMIT

0 votes

La page que vous avez liée indique : "Si vous sélectionnez uniquement quelques lignes avec LIMIT, MySQL utilise des index dans certains cas alors qu'il préférerait normalement effectuer un balayage complet de la table." Cela ne semble pas indiquer que la requête elle-même est toujours traitée comme d'habitude.

0 votes

Bon point. Je faisais une généralisation basée sur des observations à partir de l'utilisation de EXPLAIN. Merci pour la remarque.

0 votes

Le lien est très apprécié. À titre d'information, la plupart de cette réponse semble s'appliquer aux situations où, sans limite, il pourrait y avoir un grand ensemble de résultats. La question est de savoir si cela importe lorsque seule 1 ligne correspondra avec succès; auquel cas, l' "ensemble de résultats" ne contient qu'une seule ligne (même sans Limit).

10voto

La réponse, en bref, est oui. Si vous limitez votre résultat à 1, alors même si vous "attendez" un seul résultat, la requête sera plus rapide car votre base de données ne cherchera pas parmi tous vos enregistrements. Elle s'arrêtera simplement dès qu'elle trouvera un enregistrement correspondant à votre requête.

8voto

Kris Erickson Points 16204

Si un seul résultat est renvoyé, alors non, LIMIT ne le rendra pas plus rapide. Si beaucoup de résultats sont renvoyés, et que vous avez seulement besoin du premier résultat, et qu'il n'y a pas de déclarations GROUP ou ORDER, alors LIMIT rendra la requête plus rapide.

4 votes

Il devrait être plus rapide même avec 1 ligne, s'il n'y a pas de clés uniques/primaires, car il s'arrête de chercher après avoir trouvé la première occurrence

0 votes

Kris, votre première phrase pourrait être interprétée de deux façons. Si vous voulez dire "seule une ligne pourrait éventuellement être retournée" (par exemple, en interrogeant une colonne unique), alors ce que vous dites est vrai. D'autre part, si vous voulez dire "quand seulement 1 résultat correspondant est trouvé" la limite ne le rendra pas plus rapide : êtes-vous sûr ? Est-ce que cela n'évite parfois pas d'avoir à ajouter des pages supplémentaires?

2voto

driAn Points 1973

Si vous attendez vraiment un seul résultat, il est vraiment logique d'ajouter la limite à votre requête. Je ne connais pas le fonctionnement interne de MySQL, mais je suis sûr qu'il ne rassemblera pas un ensemble de résultats de plus de 100 000 enregistrements juste pour le tronquer à 1 à la fin..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X