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

86

Lorsque j'ajoute LIMIT 1 à une requête MySQL, arrête-t-il la recherche après avoir trouvé 1 résultat (ce qui la rend plus rapide) ou récupère-t-il toujours tous les résultats et tronque-t-il à la fin?

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

Réponses:

81

Selon la requête, l'ajout d'une clause limit peut avoir un effet considérable sur les performances. Si vous ne voulez qu'une seule ligne (ou savez avec certitude qu'une seule ligne peut satisfaire la requête) et que vous n'êtes pas sûr de la manière dont l'optimiseur interne l'exécutera (par exemple, la clause WHERE n'atteignant pas un index et ainsi de suite), alors vous devez absolument ajouter une clause LIMIT.

En ce qui concerne les requêtes optimisées (utilisant des index sur de petites tables), les performances n'auront probablement pas beaucoup d'importance, mais encore une fois - si vous n'êtes intéressé que par une seule ligne, ajoutez une clause LIMIT malgré tout.

Eran Galperin
la source
30
À des fins d'antibugging, vous pouvez envisager d'envoyer LIMIT 2, puis vous plaindre ou bombarder si votre hypothèse sur une seule ligne ne tient pas.
Jeffrey Hantin
6
@JeffreyHantin S'il ne peut vraiment y en avoir qu'une seule, vous devriez préférer ajouter une contrainte unique à la base de données. Beaucoup plus propre puis gâcher votre code avec des vérifications de cohérence.
Cristian Vrabie
@CristianVrabie Si cela peut être exprimé comme une contrainte unique, bien sûr, mais c'est une assertion sur les données des tables. Envoyer LIMIT 2 et vérifier 1 est une assertion sur la requête elle-même, qui peut très bien contenir un bogue tel qu'une condition de jointure mal spécifiée.
Jeffrey Hantin
1
@JeffreyHantin D'accord, mais sauf si vous codez pour Mars Rover, vous écrivez des tests pour cela plutôt que de polluer votre code.
Cristian Vrabie
8
@JeffreyHantin Si l'hypothèse qu'il n'y en a qu'une seule est correcte, est-ce que l'ajout de LIMIT 2 ne tuerait pas toute optimisation puisqu'elle rechercherait toutes les lignes? Ajouter LIMIT 2 dans ce cas n'est pas mieux (en termes d'optimisation) que de ne rien ajouter du tout.
Chris Middleton
19

La limite peut affecter les performances de la requête (voir les commentaires et le lien ci-dessous) et elle réduit également le jeu de résultats généré par MySQL. Pour une requête dans laquelle vous attendez un résultat unique, il y a des avantages.

De plus, la limitation du jeu de résultats peut en fait accélérer le temps total de requête car le transfert de grands jeux 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 de tuer un serveur en raison d'énormes ensembles de résultats 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 LIMIT

rjamestaylor
la source
La page que vous avez liée dit: "Si vous ne sélectionnez que quelques lignes avec LIMIT, MySQL utilise des index dans certains cas alors que normalement il préfère effectuer une analyse complète de la table." Cela ne semble pas que la requête elle-même soit toujours traitée comme d'habitude.
che
bon point. Je faisais une généralisation basée sur les observations de l'utilisation d'EXPLAIN. Merci pour la capture.
rjamestaylor
Le lien est très apprécié. FWIW, 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 compte quand seulement 1 ligne correspondra avec succès; auquel cas le «jeu de résultats» est seulement 1 ligne (même sans limite).
ToolmakerSteve
5

S'il n'y a qu'un seul résultat qui revient, alors non, LIMIT ne le rendra pas plus rapide. S'il y a beaucoup de résultats et que vous n'avez besoin que du premier résultat et qu'il n'y a pas d'instructions GROUP ou ORDER by, LIMIT le rendra plus rapide.

Kris Erickson
la source
2
Il devrait être plus rapide même avec 1 ligne, s'il n'y a pas de clé unique / primaire, car il arrête la recherche après avoir trouvé la première occurrence
the_nuts
Kris, ta première phrase peut être lue de deux manières. Si vous voulez dire "qu'une seule ligne pourrait être renvoyée" (par exemple, interroger une colonne unique), alors ce que vous dites est vrai. OTOH, si vous voulez dire "chaque fois qu'un seul résultat correspondant est trouvé", la limite ne le rendra pas plus rapide: êtes-vous sûr? N'évite-t-il pas parfois d'avoir à insérer des pages supplémentaires?
ToolmakerSteve
5

La réponse, en bref, est oui. Si vous limitez votre résultat à 1, même si vous "attendez" un résultat, la requête sera plus rapide car votre base de données ne parcourra pas tous vos enregistrements. Il s'arrêtera simplement une fois qu'il aura trouvé un enregistrement correspondant à votre requête.

Max Alexander Hanna
la source
1
Cette réponse est trompeuse, car elle n'a pas la mise en garde vue dans les commentaires sur d'autres réponses (7 ans plus tôt!) Que si la base de données sait qu'un seul enregistrement peut éventuellement correspondre (par exemple, interroger une colonne unique), alors la limite 1 n'aura aucun effet.
ToolmakerSteve
Sérieusement? L'optimiseur de requêtes peut tirer parti du fait que certaines conditions garantissent qu'un seul enregistrement peut être renvoyé. Je faisais remarquer que votre réponse n'est pas correcte en toutes circonstances. (Et donc soustrait la valeur de ce qui a déjà été dit des années plus tôt.) Si vous êtes d'accord, vous pourriez reconnaître l'exactitude de mon commentaire. Si vous n'êtes pas d'accord, vous pouvez clarifier pourquoi.
ToolmakerSteve
1

Si vous n'attendez vraiment qu'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.

dérAn
la source