Którą metodę spośród poniższych zapytań uważasz za lepszą? Jakie są twoje powody (wydajność kodu, lepsza konserwacja, mniej WTFery) ...
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
W najgorszym przypadku, gdy patrzysz na niezindeksowane pole, użycie MIN()
wymaga jednego pełnego przejścia tabeli. Używanie SORT
i LIMIT
wymaga sortowania plików. W przypadku porównania z dużym stołem prawdopodobnie wystąpi znacząca różnica w postrzeganej wydajności. Jako bezsensowny punkt danych, MIN()
zajęło to 0,36 sekundy SORT
i LIMIT
0,84 przeciwko tabeli wierszy 106 000 na moim serwerze deweloperskim.
Jeśli jednak patrzysz na indeksowaną kolumnę, różnica jest trudniejsza do zauważenia (bezsensowny punkt danych to 0,00s w obu przypadkach). Patrząc na wynik wyjaśnienia, wygląda jednak na to, że MIN()
jest w stanie po prostu pobrać najmniejszą wartość z indeksu (wiersze „Wybierz tabele zoptymalizowane” i „NULL”), podczas gdy SORT
i LIMIT
nadal musi wykonać uporządkowane przejście indeksu (106 000 wierszy). Rzeczywisty wpływ na wydajność jest prawdopodobnie nieistotny.
Wygląda na MIN()
to, że jest do zrobienia - w najgorszym przypadku jest szybszy, w najlepszym nierozróżnialny, to standardowy SQL i najwyraźniej wyraża wartość, którą próbujesz uzyskać. Jedynym przypadkiem, w którym wydaje się, że użycie SORT
i LIMIT
byłoby pożądane, byłoby, jak wspomniał mson , kiedy piszesz ogólną operację, która znajduje górne lub dolne wartości N z dowolnych kolumn i nie warto pisać operacji specjalnej.
Po prostu dlatego, że jest zgodny z ANSI. Limit 1 dotyczy MySql, a TOP dotyczy SQL Server.
źródło
Jak zauważyli mson i Sean McSomething , MIN jest preferowane.
Innym powodem, dla którego ORDER BY + LIMIT jest przydatny, jest to, że chcesz uzyskać wartość z innej kolumny niż kolumna MIN.
Przykład:
źródło
Myślę, że odpowiedzi zależą od tego, co robisz.
Jeśli masz 1 wyłączone zapytanie, a intencja jest tak prosta, jak określono, wybierz min (pole).
Często jednak tego typu wymagania zmieniają się na - pobierz n najlepszych wyników, pobierz n-ty - m-ty wyniki itp.
Nie sądzę, żeby to był zbyt straszny pomysł, aby zaangażować się w wybraną bazę danych. Zmiana dbs nie powinna być lekka i trzeba zmienić cenę, którą płacisz, wykonując ten ruch.
Po co ograniczać się teraz, z powodu bólu, który możesz odczuwać później lub nie?
Myślę, że dobrze jest pozostać ANSI tak bardzo, jak to możliwe, ale to tylko wskazówka ...
źródło
Biorąc pod uwagę akceptowalną wydajność, użyłbym pierwszego, ponieważ jest semantycznie bliższy intencji.
Jeśli wydajność była problemem (większość nowoczesnych optymalizatorów prawdopodobnie zoptymalizuje oba do tego samego planu zapytań, chociaż musisz to przetestować, aby to sprawdzić), to oczywiście użyłbym szybszego.
źródło