Sobes.tech
Senior

Jeśli jest tabela z JOIN-ami i potrzebny jest OFFSET — jak to zoptymalizować?

sobes.tech AI

Odpowiedź od AI

Użycie OFFSET z JOIN-ami często prowadzi do słabej wydajności, ponieważ baza danych musi przetworzyć i posortować wszystkie wiersze do potrzebnego przesunięcia.

Aby zoptymalizować, można:

  • Używać paginacji na podstawie klucza (keyset pagination), czyli zamiast OFFSET, stosować warunek WHERE z filtrem na unikalnym lub sortowalnym polu (np. id > last_seen_id). To pozwala bazie na efektywne korzystanie z indeksów.

  • Zminimalizować liczbę JOIN-ów, jeśli to możliwe, najpierw pobierając potrzebne klucze, a następnie ładując powiązane dane za pomocą osobnych zapytań.

  • Dodać niezbędne indeksy na polach sortowania i filtrowania.

Przykład paginacji na podstawie klucza:

SELECT t1.*, t2.* FROM table1 t1
JOIN table2 t2 ON t1.ref_id = t2.id
WHERE t1.id > ?
ORDER BY t1.id
LIMIT 20;

To jest znacznie bardziej wydajne niż OFFSET, szczególnie przy dużych zbiorach danych.