← strona głównaProgramowanie (Програмування)

Offset vs Cursor Pagination w Rails: co wybrać i dlaczego

W aplikacjach internetowych z dużymi zbiorami danych prędzej czy później pojawia się kwestia paginacji. Wyświetlanie od razu tysięcy rekordów w tabeli czy liście to zły pomysł zarówno dla wydajności, jak i dla użytkow...

Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W aplikacjach internetowych z dużymi zbiorami danych prędzej czy później pojawia się kwestia paginacji. Wyświetlanie od razu tysięcy rekordów w tabeli czy liście to zły pomysł zarówno dla wydajności, jak i dla użytkownika. Najpopularniejsze podejścia w Rails to paginacja offsetowa oraz paginacja kursorowa. Następnie omówimy, co to jest, jakie są zalety i wady, a także zobaczymy przykłady realizacji.

Paginacja offsetowa

Co to jest
Podejście offsetowe wykorzystuje operatory SQL OFFSET i LIMIT. Mówi bazie: "Pomiń N rekordów i weź następne M".
Przykład w Rails
# Pobierz drugą stronę z 20 rekordami
users = User.order(:id).offset(20).limit(20)
SQL, który zostanie wykonany:
SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 20 OFFSET 20;
Zalety
  • Łatwy w realizacji.
  • Dobrze integruje się z gotowymi gemami (np. kaminari, will_paginate).
  • Wygodne dla użytkownika: można szybko przejść do dowolnej strony (np. strona nr 50).
Wady
  • Problem z wydajnością: im większy offset, tym wolniej działa zapytanie. Baza danych i tak musi przejść N rekordów, aby je pominąć.
  • Niestałość wyników: jeśli w tabeli dodawane lub usuwane są rekordy podczas przeglądania, strony "przesuwają się". Użytkownik może pominąć lub dwukrotnie zobaczyć te same dane.

Paginacja kursorowa

Co to jest
Podejście kursorowe wykorzystuje "wskaźnik" (cursor) na ostatni element poprzedniej strony. Zamiast liczyć od początku, mówimy: "Pokaż następne 20 rekordów po ID = X".
Przykład w Rails
Załóżmy, że mamy użytkowników posortowanych według id.
# Pobierz pierwsze 20 rekordów
users = User.order(:id).limit(20)

# Pobierz następne po ostatnim id
last_id = users.last.id
next_users = User.where("id > ?", last_id).order(:id).limit(20)
SQL będzie wyglądać tak:
SELECT "users".* FROM "users" WHERE (id > 20) ORDER BY "users"."id" ASC LIMIT 20;
Zalety
  • Wysoka wydajność: baza nie przeszukuje tysięcy rekordów, tylko od razu skacze do odpowiedniego miejsca.
  • Stabilne wyniki: przy dodawaniu lub usuwaniu rekordów kursor gwarantuje, że nie zobaczysz duplikatów ani pominięć.
Wady
  • Brak "dowolnych stron". Możesz poruszać się tylko do przodu lub do tyłu.
  • Trudniejsze w realizacji, szczególnie jeśli kursor musi opierać się nie na jednym polu (id), ale na złożonych warunkach sortowania.

Kiedy używać którego podejścia?

Używaj paginacji offsetowej, jeśli:
  • twoje tabele są stosunkowo małe;
  • ważne jest, aby mieć możliwość przejścia do konkretnej strony (np. "Strona 50");
  • użytkownicy rzadko pracują z bardzo głębokimi listami.
Używaj paginacji kursorowej, jeśli:
  • pracujesz z dużymi zbiorami danych;
  • wydajność jest krytycznie ważna;
  • wystarczą ci przyciski "Wstecz/Dalej" zamiast konkretnych numerów stron;
  • potrzebna jest stabilność wyświetlania przy częstych aktualizacjach danych.
Paginacja offsetowa jest łatwiejsza do realizacji, ale jest wolna i mniej niezawodna dla dużych zbiorów danych. Paginacja kursorowa jest szybsza i bardziej stabilna, jednak ogranicza nawigację.
Wybór zależy od zadania: jeśli budujesz bloga lub katalog z tysiącami rekordów - podejście offsetowe jest odpowiednie. Jeśli jednak tworzysz API dla aplikacji mobilnej lub pracujesz z danymi, które ciągle się zmieniają (czaty, strumienie wiadomości) — wybierz kursor.

🔥 Więcej postów

Wszystkie wpisy
Co to jest przepełnienie całkowite?
Programowanie (Програмування)15 sie '25 08:28

Co to jest przepełnienie całkowite?

Masz licznik, który może liczyć tylko do pewnej liczby. Na przykład, kieszonkowy kalkulator, któr...

Co to jest plik HAR (HTTP Archive)?
Programowanie (Програмування)25 sie '25 18:23

Co to jest plik HAR (HTTP Archive)?

Plik HAR (HTTArchive) - to specjalny format pliku .har, w którym przechowywany jest dziennik prac...

Czym jest złożoność faktorialna?
Programowanie (Програмування)16 wrz '25 19:03

Czym jest złożoność faktorialna?

Funkcjonalna złożoność - to sytuacja, gdy liczba wariantów lub kombinacji rośnie jak silnia liczb...

Czym jest NP-trudność?
Programowanie (Програмування)16 wrz '25 19:31

Czym jest NP-trudność?

NP-trudność - to klasa problemów, dla których bardzo trudno znaleźć rozwiązanie, ale łatwo sprawd...

Czym jest ivar w Ruby / Rails?
Programowanie (Програмування)19 paź '25 20:12

Czym jest ivar w Ruby / Rails?

ivar - to skrót od instance variable (zmienna instancji). W Ruby zapisuje się ją z @ przed nazwą,...

Podstawowe metody uwierzytelniania w API
Programowanie (Програмування)19 paź '25 20:26

Podstawowe metody uwierzytelniania w API

Kiedy tworzymy API w Ruby on Rails, ważne jest, aby kontrolować, kto ma dostęp do zasobów. Oto po...

Czym różni się OAuth 1 od OAuth 2
Programowanie (Програмування)19 paź '25 20:34

Czym różni się OAuth 1 od OAuth 2

OAuth 1 OAuth 1 został opracowany na początku lat 2000 jako sposób bezpiecznego dostępu aplikacji...

Czym jest ORM i po co jest potrzebny?
Programowanie (Програмування)26 paź '25 14:00

Czym jest ORM i po co jest potrzebny?

Kiedy pracujemy z bazami danych, zazwyczaj musimy pisać zapytania SQL - selekcje, wstawienia, akt...