Tabela ma klucz podstawowy. Wykorzystaj to.
Zamiast LIMIT
i OFFSET
, zrób stronicowanie z filtrem na kluczu podstawowym. Wskazałeś na to w swoim komentarzu:
Stronicowanie przy użyciu liczb losowych ( dodaj „WIĘKSZE NIŻ ORDER BY ” do każdego zapytania )
ale nie ma nic przypadkowego w sposobie, w jaki należy to zrobić.
SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2
Pozwól klientowi określić oba parametry, ostatni widziany identyfikator i liczbę rekordów do pobrania. Twój interfejs API będzie musiał mieć symbol zastępczy, dodatkowy parametr lub alternatywne wywołanie „pobierz pierwszy n identyfikatorów”, gdzie pomija się WHERE
klauzula z zapytania, ale to trywialne.
To podejście wykorzystuje dość wydajne skanowanie indeksu, aby uporządkować rekordy, generalnie unikając sortowania lub konieczności iterowania przez wszystkie pominięte rekordy. Klient może zdecydować, ile wierszy chce naraz.
To podejście różni się od LIMIT
i OFFSET
podejście w jeden kluczowy sposób:równoczesna modyfikacja. Jeśli INSERT
do tabeli za pomocą klawisza niżej niż klucz, który niektórzy klienci już widzieli, to podejście w ogóle nie zmieni jego wyników, podczas gdy OFFSET
podejście powtórzy wiersz. Podobnie, jeśli DELETE
wiersz z identyfikatorem niższym niż wcześniej widziany, wyniki tego podejścia nie ulegną zmianie, podczas gdy OFFSET
pominie niewidoczny wiersz. Nie ma jednak różnicy w przypadku tabel zawierających tylko dołączanie z wygenerowanymi kluczami.
Jeśli wiesz z góry, że klient będzie chciał otrzymać cały zestaw wyników, najskuteczniejszą rzeczą, jaką możesz zrobić, to po prostu wysłać mu cały zestaw wyników bez żadnej z tych stronicowania. Właśnie tam chciałbym użyj kursora. Odczytaj wiersze z bazy danych i wyślij je do klienta tak szybko, jak klient je zaakceptuje. Ten interfejs API musiałby ustawić limity dotyczące powolnego działania klienta, aby uniknąć nadmiernego obciążenia zaplecza; dla powolnego klienta prawdopodobnie przełączyłbym się na stronicowanie (jak opisano powyżej) lub buforował cały wynik kursora do pliku tymczasowego i zamykał połączenie z bazą danych.
Ważne zastrzeżenia :
- Wymaga
UNIQUE
ograniczenie /UNIQUE
index lubPRIMARY KEY
być wiarygodnym - Różne równoczesne zachowanie modyfikacji w celu ograniczenia/przesunięcia, patrz wyżej