2012-07-04 11 views
5

Czy ktoś wie, czy istnieje różnica prędkości (oczywiście dla tabel, które są dość spory) między tymi dwoma zapytaniami:Czy LIMIT 0,1 przyspieszy SELECT na kluczu podstawowym?

SELECT field FROM table WHERE primary_key = "a particular value" 

czyli

SELECT field FROM table WHERE primary_key = "a particular value" LIMIT 0,1 

Należy zauważyć, że w dziedzinie primary_key jest właściwie kluczem podstawowym.

Teraz LIMIT 0,1 pomaga, gdy kwerenda byłaby kontynuowana, aby znaleźć inne dopasowania. Zakładam jednak, że gdy klucz podstawowy jest zaangażowany, powinien automatycznie zatrzymać się ze względu na jego wyjątkowość. Sądzę więc, że dodawanie go nie przyniesie żadnych korzyści.

Ktoś się z tym zetknął? Nie mam dostatecznie dużego zestawu danych, aby przetestować go w tej chwili. Zakładam również, że ta sama odpowiedź dotyczyłaby dowolnego pola, które zostało ustawione na UNIQUE.

+5

Można znaleźć tego odczytu jako: http://dev.mysql.com/doc/refman/5.0/en/explain-output.html#explain-join-types szczególnie nagłówek „wytłumaczyć przyłączyć typy " – Hammerite

Odpowiedz

6

Więc po przeczytaniu informacji dostarczonych przez Hammerite (dzięki za to) działa explain obu zapytań produkuje:

  • id = 1
  • SELECT_TYPE = SIMPLE
  • table = stół
  • type = CONST
  • possible_keys = PRIMARY
  • key = PRIMARY
  • key_len = 767
  • ref = const
  • wiersze = 1
  • Extra =

który identyfikuje zarówno zapytań jak CONST, które link definiuje jako:

const

Stół ma najwyżej e pasujący wiersz, który jest czytany na początku zapytania . Ponieważ istnieje tylko jeden wiersz, wartości z kolumny w wierszu można uznać za stałe przez resztę optymalizatora. Tabele const są bardzo szybkie, ponieważ są odczytywane tylko raz.

Więc zakładając, że dobrze rozumiem oba pytania, byłyby one traktowane tak samo - czyli to, co się spodziewałem.

4

Klucze podstawowe zostaną przeszukiwane jako indeks, który jest dość szybki.

Ale ograniczenie zakresu zapytań jest częścią najlepszych praktyk.

na dowolnym bardziej złożonych zapytań Będzie ona z przyłącza, Group_by i porządek przez lub nawet pojedynczych wyszukiwań, to pozwolić sql do zatrzymania, po tym jak twój rekord limity ROW_COUNT zostanie znaleziony, np: 1

Jeśli użyć zamówienie przez, to pozwoli sql na rozpoczęcie wyszukiwania odpowiednio z zamówionej przez kolumnę i zatrzymanie po znalezieniu tego 1 rekordu, nawet jeśli inne zapisy zostaną znalezione w innych określonych kolumnach lub warunkach, np .:

SELECT Primary_keycoll,field2 FROM table WHERE Primary_keycoll = "value1" or field2 = 'value1' order by field2 limit 0,1 Może Primary_keycoll jest wyjątkowy, ale inne np .: field2 może nie, ograniczając do 1, zezwala mysql na pobranie pierwszego i zatrzymanie, w przeciwnym razie przejdzie przez wszystkie określone kolumny lub zasoby, aby zapewnić inne kolumny umns nie spełniają kwerendy.

Używanie limitu na końcu zapytania jest dobrą praktyką ze względów bezpieczeństwa, blokuje niektóre sztuczki z iniekcją SQL. tak długo, jak twoje ograniczniki, są odpowiednio oczyszczane.

http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

+1

+1 Dziękuję za dodatkowe informacje :) - chociaż mam świadomość, że LIMIT zawsze będzie pomocny w odniesieniu do bardziej złożonych (lub nieindeksowanych/nieunikalnych) zapytań. A teraz od zadawania tego pytania zdaję sobie sprawę z tego, jak unikalne pola będą domyślnie automatycznie ograniczane ... Nie myślałem o możliwych korzyściach z wdrożenia LIMIT jako pomocy przeciwko iniekcjom SQL ... to jest dobry punkt. – Pebbl

+3

Informacje dodatkowe: 'LIMIT 0' szybko zwraca pusty zestaw. Może to służyć do sprawdzania ważności zapytania. Jeśli zapytanie jest prawidłowe, nie otrzymasz informacji o błędzie, a jeśli jest nieprawidłowy, otrzymasz opis błędu. Może być użyty do sprawdzania składni dużych zbiorów danych. – GuruJR

+1

+1 Myślę, że argumentowałeś na tyle, że zawsze warto używać LIMIT 0,1, jeśli możesz ... i użyć LIMIT 0, jeśli chcesz sprawdzić ważność zapytania. ładne punkty. – Pebbl

Powiązane problemy