„Limit 1000,25” vs „limit 25 Offset 1000”

11

Niedawno dowiedziałem się, że MySQL ma offsetfunkcję. Próbowałem znaleźć dokumentację dotyczącą wyników przesunięcia lub różnicy między przesunięciem a wariantem ograniczenia, ale nie mogę znaleźć tego, czego szukam.

Powiedzmy, że mam 10.000 wierszy w tabeli i chcę 25 wyników z wiersza 1.000. Do tej pory mogłem zrobić oba, aby uzyskać ten sam wynik:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Chciałbym wiedzieć, jaka jest różnica między nimi.

  • Czy to faktycznie robi to samo, czy też moje rozumienie jest błędne?
  • Jest jeden wolniejszy / szybszy w większych tabelach
  • Czy wynik przesunięcia zmienia się, gdy to robię WHERE column=1(powiedzmy, że kolumna ma> 100 różnych wartości)
  • Czy wynik przesunięcia zmienia się, gdy to robię ORDER BY column ASC(zakładając, że ma losowe wartości)

Jeśli jest to „głupie” pytanie i ktoś zna jakąkolwiek dokumentację wyjaśniającą ten temat, dodaj go w odpowiedziach.
Mam wrażenie, że przesunięcie pomija pierwsze X wierszy znalezionych w bazie danych, pomijając sortowanie i gdzie.

Martijn
źródło
Dokumentacja MySQL doskonale to wyjaśnia. Czy istnieje powód, dla którego nie byłeś zainteresowany oglądaniem go samemu?
siride
1
„Aby zapewnić zgodność z PostgreSQL, MySQL obsługuje również składnię offsetową LIMIT row_count OFFSET.” (od dev.mysql.com/doc/refman/5.5/en/select.html ).
siride,
Ponieważ to wciąż nie odpowiada na moje pytania. Z twojego cytatu (i ich tekstu na stronie) powinienem wyciągnąć wniosek, że offset jest tym samym co limit, tylko napisany inaczej, tak jakby LIMIT był skrótem wyboru?
Martijn
1
ma inną składnię do wyrażania tego samego. Pozostałe pytania podrzędne różnią się całkowicie od tytułu i pierwszej części posta.
siride
1
Rozumiem, że jeśli jest to to samo, inne zapytania nie zostaną wykonane inaczej w obu sytuacjach. Po prostu nie byłem przekonany, że to to samo, to była odpowiedź, której szukałem, dzięki.
Martijn

Odpowiedzi:

9

Pod względem działania

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

nie ma absolutnie żadnej różnicy w stwierdzeniach

Komentarz @ siride jest właśnie o to chodzi.

LIMIT 1000,25 znaczy LIMIT 25 OFFSET 1000

Z tej samej dokumentacji

LIMIT row_count jest równa LIMIT 0, row_count

TWOJE RZECZYWISTE PYTANIA

  • Czy to faktycznie robi to samo, czy też moje rozumienie jest błędne?
  • Jest jeden wolniejszy / szybszy w większych tabelach

Ponieważ oba zapytania są takie same, nie ma różnicy

  • Czy wynik przesunięcia zmienia się, gdy robię GDZIE kolumna = 1 (powiedzmy, że kolumna ma> 100 różnych wartości)
  • Czy wynik przesunięcia zmienia się, gdy wykonuję kolumnę ASC ORDER BY (zakładając, że ma losowe wartości)

Użycie LIMITnie zmienia żadnych zestawów wyników. Po prostu poruszają się w zestawie wyników.

To zapytanie

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

byłoby inaczej niż

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

ponieważ LIMIT jest stosowany na innym etapie.

Pierwsze zapytanie nic nie zwraca, jeśli tablename ma mniej niż 1000 wierszy

Drugie zapytanie nic nie zwraca, jeśli podzapytanie ma mniej niż 1000 wierszy

WNIOSEK

Musisz wyrzeźbić zapytanie, aby upewnić się, że sortujesz dane na właściwym etapie

RolandoMySQLDBA
źródło
1
Dziękuję Ci. To: „Absolutnie nie ma różnicy w stwierdzeniach” było dokładnie tym, czego szukałem, a przy tej odrobinie informacji widzę to sortowanie lub to, co nie ma znaczenia. Nie byłem pewien, czy to było to samo, a przy kodowaniu diabła tkwi w szczegółach, chciałbym wiedzieć na pewno :)
Martijn