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?
Odpowiedz
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.
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. –
@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. –
@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. –
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 ..
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
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
dobry punkt. Generalizowałem na podstawie obserwacji przy użyciu EXPLAIN. Dzięki za połów. – rjamestaylor
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.
Powinien być szybszy nawet w 1 rzędzie, jeśli nie ma kluczy unikalnych/podstawowych, ponieważ zatrzymuje wyszukiwanie po znalezieniu pierwszego wystąpienia –
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.
- 1. Co sprawia, że jedno z tych zapytań jest szybsze?
- 2. Ostrzeżenie: date_format() oczekuje, że parametr 1 będzie DateTime
- 3. Kapibara oczekuje, że strona będzie zawierała więcej niż jeden raz
- 4. Arquillian: Dodanie pliku beans.xml powoduje, że "ArquillianServletRunner nie został znaleziony"
- 5. mysqli_fetch_array() oczekuje, że parametr 1 będzie mysqli_result, boolean podany w
- 6. Skąd wiadomo, że klawiatura jest otwarta?
- 7. Skąd wiadomo, że kontrolka WPF jest renderowana?
- 8. Dlaczego resetowanie kolekcji backbone.js powoduje tylko dodanie 1 modelu
- 9. Czy oczekujesz, że reszta metody będzie asynchroniczna?
- 10. Skąd wiadomo, że EditText traci ostrość?
- 11. tableView.dequeueReusableCellWithIdentifier() powoduje, że aplikacja do powieszenia
- 12. Skąd wiadomo, że strumień jest zamknięty?
- 13. Skąd wiadomo, że tableView zaczął przewijanie
- 14. MySQL: "LIMIT 5" powoduje ostrzeżenia
- 15. Skąd wiadomo, że aktywność została zakończona?
- 16. Typeahead.js/Bloodhound wyświetla tylko jeden wynik
- 17. Skąd wiadomo, że NSTextView traci ostrość?
- 18. Skąd wiadomo, że moja aplikacja nie została dodana do zapory?
- 19. Czy porównywanie ciągów == działa tylko dlatego, że ciągi są niezmienne?
- 20. Powoduje, że PHP ulega awarii
- 21. Wnioskowanie typu Scala nie zauważa, że te typy są identyczne, niezależnie od tego, czy są one
- 22. natToFin gdy istnieją dowody na to, że konwersja będzie działać
- 23. PHP i MySQL: mysqli_num_rows() oczekuje, że parametr 1 będzie mysqli_result, boolean podany
- 24. Powoduje, że wszystkie elementy obiektu ViewPager są wyrównane do środka, gdy PagerAdapter.getPageWidth() <1f
- 25. Dodanie jeden dodatkowy wiersz do wyniku MySQL kwerendy wybierającej
- 26. NSSplitView powoduje, że tylko jeden panel rozwija się przy zmianie rozmiaru okna za pomocą automatycznego układu?
- 27. Dlaczego jeden wątek jest szybszy niż wiele wątków, mimo że mają one zasadniczo ten sam narzut?
- 28. nodelay() powoduje, że program Python Curses opuścił
- 29. Czy struktura przypisania gwarantuje, że dopełnienie będzie równe?
- 30. Meteor.js Skąd wiadomo, że moja kolekcja jest gotowa na kliencie?
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