- Offset (
LIMIT 20 OFFSET 40/?page=3): đơn giản, nhảy trang bất kỳ, hiện tổng số trang. Hai điểm yếu: (1) chậm ở trang sâu — DB vẫn quét rồi bỏ 40 hàng đầu; (2) trôi kết quả — nếu có bản ghi được thêm/xóa giữa chừng, hàng bị lặp hoặc bị nhảy. - Cursor (keyset): dùng con trỏ là giá trị của hàng cuối (
WHERE id < last_id ORDER BY id DESC LIMIT 20). Nhanh và ổn định ở mọi độ sâu vì tận dụng index, không đếm offset. Đổi lại: không nhảy trang tùy ý, chỉ tiến/lùi tuần tự, và cần cột sắp xếp ổn định + duy nhất.
Chốt: danh sách nhỏ, cần nhảy trang → offset; feed vô hạn, dữ liệu đổi liên tục, bảng lớn → cursor.