2009-01-18 10 views
69

Kiedy dodaję LIMIT 1 do zapytania MySQL, zatrzymuje on wyszukiwanie po znalezieniu 1 wyniku (co przyspiesza) lub czy nadal pobiera wszystkie wyniki i obcina na końcu?Czy dodanie "LIMIT 1" do zapytań MySQL powoduje, że są one szybsze, gdy wiadomo, że będzie tylko jeden wynik?

+0

Nie, jeśli istnieje ograniczenie (lub indeks) "UNIQUE" (lub "PRIMARY KEY") w kolumnie filtra. http://stackoverflow.com/questions/8467092/does-using-limit-1-speed-up-a-query-on-a-primary-key – ma11hew28

Odpowiedz

61

W zależności od zapytania dodanie klauzuli limitu może mieć ogromny wpływ na wydajność. Jeśli chcesz mieć tylko jeden wiersz (lub wiesz, że tylko jeden wiersz może spełnić zapytanie) i nie masz pewności, jak zostanie wykonany wewnętrzny optymalizator (na przykład klauzula WHERE nie trafia na indeks itp.), powinieneś zdecydowanie dodać klauzulę LIMIT.

Co do zoptymalizowanych zapytań (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, niż dodawanie klauzuli LIMIT niezależnie.

+24

Dla celów antyugugowania możesz rozważyć wysłanie LIMITU 2, a potem narzekać lub zbombardować, jeśli twoje jednorzędowe założenie nie zostanie spełnione. –

+5

@JeffreyHantin Jeśli naprawdę istnieje tylko jeden, powinieneś raczej dodać unikalne ograniczenie do bazy danych. Znacznie czystsze, a następnie zepsucie twojego kodu dzięki kontrolom poprawności. –

+0

@CristianVrabie Jeśli można to wyrazić jako wyjątkowe ograniczenie, to z pewnością, ale jest to stwierdzenie dotyczące danych w tabelach. Wysyłanie LIMITU 2 i sprawdzanie 1 to asercja dotycząca samej kwerendy, która może zawierać błąd, taki jak nieodpowiednio określony warunek łączenia. –

1

Jeśli naprawdę oczekujesz tylko jednego wyniku, to naprawdę warto dołączyć LIMIT do zapytania. Nie znam działania MySQL, ale jestem pewny, że nie zbierze zestawu wyników z 100'000 + rekordów tylko po to, by skrócić go do 1 na końcu ..

16

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

Co więcej, ograniczenie zestawu wyników może w rzeczywistości przyspieszyć całkowity czas zapytania, ponieważ przenoszenie dużych zestawów wyników wykorzystuje pamięć i potencjalnie tworzy tymczasowe tabele na dysku. Wspominam o tym, ponieważ ostatnio widziałem aplikację, która nie używała limitu zabicia serwera z powodu ogromnych zestawów wyników i z ograniczeniem w miejscu, w którym wykorzystanie zasobów ogromnie spadło.

Sprawdź tę stronę po więcej konkretów: MySQL Documentation: LIMIT Optimization

+0

Strona, którą łączysz mówi: "Jeśli wybierasz tylko kilka wierszy z LIMIT, MySQL używa indeksów w niektórych przypadkach, gdy normalnie wolałby wykonać pełne skanowanie tabeli." To nie wygląda na to, że samo zapytanie jest zawsze przetwarzane jak zwykle. – che

+0

dobry punkt. Generalizowałem na podstawie obserwacji przy użyciu EXPLAIN. Dzięki za połów. – rjamestaylor

5

Jeśli istnieje tylko 1 wynik wraca, to nie, nie będzie LIMIT zrobić to szybciej. Jeśli jest dużo wyników, a potrzebujesz tylko pierwszego wyniku, a nie ma grupy GROUP lub ORDER według instrukcji, to LIMIT przyspieszy to.

+0

Powinien być szybszy nawet w 1 rzędzie, jeśli nie ma kluczy unikalnych/podstawowych, ponieważ zatrzymuje wyszukiwanie po znalezieniu pierwszego wystąpienia –

0

Krótko mówiąc, odpowiedź brzmi "tak". Jeśli ograniczysz wynik do 1, to nawet jeśli "spodziewamy się" jednego wyniku, zapytanie będzie szybsze, ponieważ baza danych nie przejrzy wszystkich zapisów. Zatrzyma się po znalezieniu rekordu pasującego do zapytania.

Powiązane problemy