Nie możesz wiedzieć, jaki jest pierwszy identyfikator na danej stronie, ponieważ numery identyfikatorów niekoniecznie są sekwencyjne. Innymi słowy, w sekwencji mogą występować luki, więc wiersze na piątej stronie zawierającej 100 wierszy niekoniecznie zaczynają się od id 500. Może na przykład zaczynać się od id 527. Nie da się tego poznać.
Inaczej mówiąc:id to wartość, a nie numer wiersza.
Jednym z możliwych rozwiązań, jeśli Twój klient przechodzi przez strony w kolejności rosnącej, jest to, że każde żądanie REST pobiera dane, zauważa największe wartość identyfikatora na tej stronie, a następnie używa jej w następnej Żądanie REST, więc pyta o wartości identyfikatorów, które są większe.
SELECT ... FROM ... WHERE filterKey = filterValue
AND id > id_of_last_match_of_previous_page
Ale jeśli twoje żądanie REST może pobrać dowolną losową stronę, to rozwiązanie nie działa. To zależy od tego, czy pobrałeś już poprzednią stronę.
Innym rozwiązaniem jest użycie LIMIT <x> OFFSET <y>
składnia. Pozwala to zażądać dowolnej dowolnej strony. LIMIT <y>, <x>
działa tak samo, ale z jakiegoś powodu x i y są odwrócone w dwóch różnych formach składni, więc miej to na uwadze.
Używając LIMIT...OFFSET
nie jest zbyt wydajny, gdy żądasz strony zawierającej wiele stron w wyniku. Załóżmy, że prosisz o 5000. stronę. MySQL musi wygenerować po stronie serwera wynik 5000 stron, a następnie odrzucić 4999 z nich i zwrócić ostatnią stronę w wyniku. Przepraszamy, ale tak to działa.
Odpowiedz na swój komentarz:
Musisz zrozumieć, że WHERE
stosuje warunki do wartości w wierszach, ale strony są definiowane przez pozycję wierszy. To są dwa różne sposoby określania rzędów!
Jeśli masz kolumnę, która na pewno będzie numerem wiersza , możesz użyć tej wartości jak pozycji wiersza. Możesz nawet umieścić na nim indeks lub użyć go jako klucza podstawowego.
Ale wartości klucza podstawowego mogą się zmieniać i mogą nie być kolejne, na przykład w przypadku aktualizacji lub usunięcia wierszy lub wycofania niektórych transakcji i tak dalej. Zmiana numeracji wartości klucza głównego to zły pomysł, ponieważ inne tabele lub dane zewnętrzne mogą odwoływać się do wartości klucza głównego.
Możesz więc dodać kolejną kolumnę, która nie klucz podstawowy, ale tylko numer wiersza.
ALTER TABLE MyTable ADD COLUMN row_number BIGINT UNSIGNED, ADD KEY (row_number);
Następnie wypełnij wartości, gdy musisz zmienić numerację wierszy.
SET @row := 0;
UPDATE MyTable SET row_number = (@row := @row + 1) ORDER BY id;
Będziesz musiał zmienić numerację wierszy, jeśli kiedykolwiek usuniesz niektóre, na przykład. Często nie jest to efektywne, w zależności od rozmiaru tabeli.
Ponadto nowe wstawki nie mogą tworzyć poprawnych wartości numerów wierszy bez zablokowania tabeli. Jest to konieczne, aby zapobiec sytuacji wyścigu.
Jeśli masz gwarancję, że row_number
jest sekwencją następujących po sobie wartości, to jest zarówno wartością, jak i pozycją wiersza, dzięki czemu można go używać do wyszukiwania indeksów o wysokiej wydajności dla dowolnej strony wierszy.
SELECT * FROM MyTable WHERE row_number BETWEEN 401 AND 500;
Przynajmniej do czasu, gdy kolejność numerów wierszy zostanie poddana w wątpliwość przez usunięcie lub nowe wstawienie.