L'aggiunta di "LIMIT 1" alle query MySQL le rende più veloci quando sai che ci sarà solo 1 risultato?


Risposte:


81

A seconda della query, l'aggiunta di una clausola limite può avere un enorme effetto sulle prestazioni. Se si desidera una sola riga (o si sa per certo che solo una riga può soddisfare la query) e non si è sicuri di come verrà eseguita dall'ottimizzatore interno (ad esempio, la clausola WHERE non colpisce un indice e così via), allora dovresti assolutamente aggiungere una clausola LIMIT.

Per quanto riguarda le query ottimizzate (utilizzando gli indici su tabelle piccole) probabilmente non avrà molta importanza in termini di prestazioni, ma ancora una volta, se sei interessato solo a una riga, aggiungi una clausola LIMIT a prescindere.


30
Per scopi antibugging potresti prendere in considerazione l'invio di LIMIT 2 e poi lamentarti o bombardare se la tua ipotesi di riga singola non regge.
Jeffrey Hantin

6
@JeffreyHantin Se davvero può essercene uno solo, dovresti preferire l'aggiunta di un vincolo univoco al database. Molto più pulito quindi incasinare il codice con controlli di integrità.
Cristian Vrabie

@CristianVrabie Se può essere espresso come un vincolo univoco, certo, ma questa è un'affermazione sui dati nelle tabelle. L'invio di LIMIT 2 e il controllo di 1 è un'asserzione sulla query stessa, che potrebbe contenere un bug come una condizione di join specificata in modo inadeguato.
Jeffrey Hantin

1
@ JeffreyHantin Abbastanza giusto, ma a meno che non codifichi per il Mars Rover scrivi test per questo piuttosto che inquinare il tuo codice.
Cristian Vrabie

8
@ JeffreyHantin Se l'ipotesi che ce ne sia solo una è corretta, l'aggiunta di LIMIT 2 non ucciderebbe alcuna ottimizzazione poiché cercherebbe tutte le righe? Aggiungere LIMIT 2 in questo caso non è migliore (dal punto di vista dell'ottimizzazione) che non aggiungere nulla.
Chris Middleton

19

Il limite può influire sulle prestazioni della query (vedere i commenti e il collegamento sotto) e riduce anche il set di risultati che viene emesso da MySQL. Per una query in cui ti aspetti un unico risultato ci sono dei vantaggi.

Inoltre, limitare il set di risultati può infatti accelerare il tempo totale di query poiché il trasferimento di set di risultati di grandi dimensioni utilizza la memoria e potenzialmente crea tabelle temporanee su disco. Dico questo dato che di recente ho visto un'applicazione che non utilizzava il limite uccidere un server a causa di enormi set di risultati e con il limite in atto l'utilizzo delle risorse è diminuito enormemente.

Controlla questa pagina per maggiori dettagli: MySQL Documentation: LIMIT Optimization


La pagina che hai collegato dice: "Se stai selezionando solo poche righe con LIMIT, MySQL utilizza gli indici in alcuni casi quando normalmente preferirebbe eseguire una scansione completa della tabella". Non sembra che la query stessa venga sempre elaborata come al solito.
che il

buon punto. Stavo facendo una generalizzazione basata sulle osservazioni dall'uso di EXPLAIN. Grazie per la cattura.
rjamestaylor

Il collegamento è molto apprezzato. FWIW, la maggior parte di questa risposta sembra applicarsi a situazioni in cui senza limiti, potrebbe esserci un ampio set di risultati . La domanda è chiedersi se è importante quando solo 1 riga potrà mai corrispondere con successo; in tal caso il "set di risultati" è solo 1 riga (anche senza Limite).
ToolmakerSteve

5

Se viene restituito un solo risultato, no, LIMIT non lo renderà più veloce. Se ci sono molti risultati e hai solo bisogno del primo risultato e non ci sono istruzioni GROUP o ORDER by, LIMIT lo renderà più veloce.


2
Dovrebbe essere più veloce anche con 1 riga, se non ci sono chiavi univoche / primarie, perché interrompe la ricerca dopo aver
trovato

Kris, la tua prima frase potrebbe essere letta in due modi. Se intendi "solo 1 riga potrebbe mai essere restituita" (ad esempio interrogando una colonna univoca), allora quello che dici è vero. OTOH, se intendi "ogni volta che viene trovato un solo risultato corrispondente" il limite non lo renderà più veloce: sei sicuro? A volte non evita di dover inserire pagine aggiuntive?
ToolmakerSteve

5

La risposta, in breve, è sì. Se limiti il ​​risultato a 1, anche se "ti aspetti" un risultato, la query sarà più veloce perché il tuo database non esaminerà tutti i tuoi record. Si fermerà semplicemente una volta trovato un record che corrisponde alla tua query.


1
Questa risposta è fuorviante, perché manca l'avvertenza vista nei commenti su altre risposte (7 anni prima!) Che se il DB sa che un solo record può eventualmente corrispondere (ad esempio, interrogando una colonna unica), allora il Limite 1 non avrà effetto.
ToolmakerSteve

Sul serio? Query Optimizer può trarre vantaggio dal fatto che determinate condizioni garantiscono che sia possibile restituire solo 1 record. Stavo facendo notare che la tua risposta non è corretta in tutte le circostanze. (E quindi sottrae valore a quanto già detto anni prima). Se sei d'accordo, potresti riconoscere la correttezza del mio commento. Se non sei d'accordo, potresti chiarire il motivo.
ToolmakerSteve

1

Se ti aspetti davvero un solo risultato, ha davvero senso aggiungere il LIMITE alla tua query. Non conosco il funzionamento interno di MySQL, ma sono sicuro che non raccoglierà un set di risultati di oltre 100'000 record solo per troncarlo a 1 alla fine ..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.