Pagination trong REST API: offset vs cursor, chọn cái nào?
21/07/2026
Khi API trả về danh sách dài, phân trang (pagination) là bắt buộc. Hai cách phổ biến nhất — offset và cursor — có đánh đổi rất khác nhau.
Offset-based pagination
Cách quen thuộc: ?page=3&size=20 dịch sang LIMIT 20 OFFSET 40. Dễ hiểu, cho phép nhảy tới trang bất kỳ.
- Nhược điểm hiệu năng:
OFFSET 1000000vẫn phải quét bỏ 1 triệu dòng trước đó — càng về sau càng chậm - Trang bị lệch: nếu có dòng mới chèn vào giữa lúc người dùng lật trang, một số bản ghi bị lặp hoặc bị bỏ sót
Cursor-based pagination
Thay vì đếm vị trí, ta ghi nhớ 'con trỏ' tới dòng cuối đã xem (thường là id hoặc timestamp) và lấy tiếp: WHERE id > :lastId ORDER BY id LIMIT 20.
- Hiệu năng ổn định kể cả ở cuối tập dữ liệu (tận dụng index)
- Không bị lệch khi dữ liệu thay đổi
- Nhược điểm: không nhảy tới trang tuỳ ý, chỉ đi tiếp/lùi
Chọn cái nào?
Offset hợp cho bảng nhỏ, UI cần số trang cụ thể. Cursor hợp cho danh sách lớn, feed vô hạn (infinite scroll), API công khai cần hiệu năng ổn định. Với dữ liệu lớn và tải cao, cursor gần như luôn thắng.
👉 Dùng thử công cụ liên quan trên dev-hub: JSON Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.