Czy dodanie „LIMIT 1” do zapytań MySQL przyspiesza je, gdy wiesz, że będzie tylko 1 wynik?

86

Kiedy dodam LIMIT 1 do zapytania MySQL, czy zatrzymuje wyszukiwanie po znalezieniu 1 wyniku (tym samym przyspieszając), czy nadal pobiera wszystkie wyniki i obcina na końcu?

Logan Serman
źródło
1
Nie, jeśli istnieje UNIQUE(lub PRIMARY KEY) ograniczenie (lub indeks) w kolumnie filtru. stackoverflow.com/questions/8467092/…
ma11hew28

Odpowiedzi:

81

W zależności od zapytania dodanie klauzuli limitu może mieć ogromny wpływ na wydajność. Jeśli potrzebujesz tylko jednego wiersza (lub wiesz na pewno, że tylko jeden wiersz może spełnić zapytanie) i nie masz pewności, w jaki sposób wewnętrzny optymalizator go wykona (na przykład klauzula WHERE nie trafiająca w indeks itd.), To zdecydowanie powinieneś dodać klauzulę LIMIT.

Jeśli chodzi o zapytania zoptymalizowane (przy użyciu indeksów na małych tabelach), prawdopodobnie nie będzie to miało większego znaczenia dla wydajności, ale znowu - jeśli interesuje Cię tylko jeden wiersz, to i tak dodaj klauzulę LIMIT.

Eran Galperin
źródło
30
W celach przeciwdziałania błędom możesz rozważyć wysłanie LIMITU 2, a następnie narzekać lub zbombardować, jeśli twoje jednorzędowe założenie się nie sprawdza.
Jeffrey Hantin
6
@JeffreyHantin Jeśli naprawdę może być tylko jeden, powinieneś preferować dodanie unikalnego ograniczenia do bazy danych. Znacznie czystszy niż zepsucie kodu za pomocą kontroli poprawności.
Cristian Vrabie
@CristianVrabie Jeśli można to wyrazić jako unikalne ograniczenie, jasne, ale jest to stwierdzenie dotyczące danych w tabelach. Wysłanie LIMITU 2 i sprawdzenie 1 jest potwierdzeniem samego zapytania, które może równie dobrze zawierać błąd, taki jak nieodpowiednio określony warunek łączenia.
Jeffrey Hantin
1
@JeffreyHantin W porządku, ale z wyjątkiem przypadku, gdy kodujesz dla Mars Rover, piszesz testy w tym celu, a następnie zanieczyszczasz swój kod.
Cristian Vrabie
8
@JeffreyHantin Jeśli założenie, że istnieje tylko jeden jest poprawne, czy dodanie LIMIT 2 nie zabije żadnej optymalizacji, ponieważ przeszukałoby wszystkie wiersze? Dodanie LIMITU 2 w tym przypadku nie jest lepsze (pod względem optymalizacji) niż dodanie niczego.
Chris Middleton,
19

Limit może wpływać na wydajność zapytania (patrz komentarze i link poniżej), a także zmniejsza zestaw wyników wysyłany przez MySQL. W przypadku zapytania, w którym spodziewasz się pojedynczego wyniku, istnieją korzyści.

Ponadto ograniczenie zestawu wyników może w rzeczywistości przyspieszyć całkowity czas zapytania, ponieważ przesyłanie dużych zestawów wyników zajmuje pamięć i potencjalnie tworzy tymczasowe tabele na dysku. Wspominam o tym, ponieważ ostatnio widziałem aplikację, która nie używała limitu zabijania serwera z powodu ogromnych zestawów wyników, a przy ograniczeniu wykorzystanie zasobów ogromnie spadło.

Sprawdź tę stronę, aby uzyskać więcej informacji: Dokumentacja MySQL: Optymalizacja LIMIT

rjamestaylor
źródło
Strona, do której utworzyłeś łącze, mówi: „Jeśli wybierzesz tylko kilka wierszy z opcją LIMIT, MySQL używa indeksów w niektórych przypadkach, podczas gdy normalnie wolałby wykonać pełne skanowanie tabeli”. To nie wygląda na to, że samo zapytanie jest zawsze przetwarzane w zwykły sposób.
che
Słuszna uwaga. Robiłem uogólnienie na podstawie obserwacji z użycia EXPLAIN. Dzięki za połów.
rjamestaylor
Link jest bardzo ceniony. FWIW, większość tej odpowiedzi wydaje się odnosić do sytuacji, w których bez limitu może istnieć duży zestaw wyników . Pytanie brzmi, czy ma znaczenie, kiedy tylko 1 wiersz kiedykolwiek zostanie pomyślnie dopasowany; w takim przypadku „zbiór wyników” to tylko 1 wiersz (nawet bez limitu).
ToolmakerSteve
5

Jeśli wraca tylko 1 wynik, to nie, LIMIT nie przyspieszy tego. Jeśli wyników jest dużo i potrzebujesz tylko pierwszego wyniku, a nie ma instrukcji GROUP ani ORDER, to LIMIT przyspieszy to.

Kris Erickson
źródło
2
Powinien być szybszy nawet z 1 wierszem, jeśli nie ma kluczy unikalnych / podstawowych, ponieważ przestaje szukać po znalezieniu pierwszego wystąpienia
the_nuts
Kris, twoje pierwsze zdanie można odczytać na dwa sposoby. Jeśli masz na myśli „tylko 1 wiersz mógłby kiedykolwiek zostać zwrócony” (np. Zapytanie o unikalną kolumnę), to to, co mówisz, jest prawdą. OTOH, jeśli masz na myśli „zawsze, gdy zostanie znaleziony tylko 1 pasujący wynik”, limit nie przyspieszy tego: czy na pewno? Czy nie pozwala to czasami uniknąć konieczności pobierania dodatkowych stron?
ToolmakerSteve
5

Krótko mówiąc, tak. Jeśli ograniczysz wynik do 1, to nawet jeśli „oczekujesz” jednego wyniku, zapytanie będzie szybsze, ponieważ Twoja baza danych nie przejrzy wszystkich Twoich rekordów. Po prostu zatrzyma się, gdy znajdzie rekord pasujący do zapytania.

Max Alexander Hanna
źródło
1
Ta odpowiedź jest myląca, ponieważ nie ma w niej zastrzeżenia, które widzieliśmy w komentarzach do innych odpowiedzi (7 lat wcześniej!), Że jeśli DB wie, że tylko jeden rekord może być dopasowany (np. Zapytanie o unikalną kolumnę), wtedy Limit 1 nie będzie miał żadnego efektu.
ToolmakerSteve
Poważnie? Optymalizator zapytań może wykorzystać fakt, że pewne warunki gwarantują, że można zwrócić tylko 1 rekord. Zwracałem uwagę, że twoja odpowiedź nie jest poprawna we wszystkich okolicznościach. (I dlatego odejmuje wartość od tego, co zostało powiedziane już wiele lat wcześniej). Jeśli się zgodzisz, możesz potwierdzić poprawność mojego komentarza. Jeśli się nie zgadzasz, możesz wyjaśnić, dlaczego.
ToolmakerSteve
1

Jeśli naprawdę oczekujesz tylko jednego wyniku, to naprawdę sensowne jest dodanie LIMITU do zapytania. Nie znam wewnętrznego działania MySQL, ale jestem pewien, że nie zbierze zestawu wyników składającego się z ponad 100 000 rekordów tylko po to, aby na koniec skrócić go z powrotem do 1.

driAn
źródło