Các Loại Phân Trang Phổ Biến Trong Lập Trình (Pagination) — Khi Nào Nên Dùng Loại Nào?
Giới thiệu
Khi làm việc với lượng dữ liệu lớn trong ứng dụng web hoặc API, việc hiển thị toàn bộ dữ liệu một lúc là bất khả thi. Lúc này, phân trang (pagination) giúp chia nhỏ kết quả, giảm tải cho hệ thống, và cải thiện trải nghiệm người dùng. Có nhiều kỹ thuật phân trang khác nhau, mỗi loại có ưu nhược điểm riêng. Bài viết này sẽ giúp bạn hiểu rõ các loại phân trang phổ biến nhất hiện nay và khi nào nên sử dụng chúng.
1.Offset-Based Pagination (Phân trang theo vị trí)
Cách hoạt động
Đây là kỹ thuật phân trang cơ bản nhất. Hệ thống sử dụng offset (vị trí bắt đầu) và limit (số lượng bản ghi) để truy vấn dữ liệu.
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 10 OFFSET 30;
Lấy 10 sản phẩm, bắt đầu từ sản phẩm thứ 31.
Ưu điểm
- Dễ hiểu, dễ cài đặt - Offset pagination sử dụng các tham số như offset (số lượng bản ghi cần bỏ qua) và limit (số lượng bản ghi trên mỗi trang), khiến logic xử lý trở nên đơn giản.
 - Hỗ trợ điều hướng linh hoạt - Người dùng có thể trực tiếp đến bất kỳ trang nào họ muốn.
 - Hiển thị tổng số trang: Có thể dễ dàng tính toán và hiển thị tổng số trang cho người dùng.
 
Nhược điểm
- Hiệu năng thấp khi dữ liệu lớn do database vẫn cần phải duyệt qua toàn bộ bản ghi trước offset (số lượng bản ghi cần bỏ qua).
 - Dễ gây sai lệch khi dữ liệu thay đổi (thêm, hoặc xóa bản ghi).
 
Gợi ý sử dụng
- Dữ liệu nhỏ hoặc trung bình.
 - Hệ thống quản trị nội bộ, dashboard.
 - Hệ thống không yêu cầu hiệu năng quá cao.
 
2. Cursor-Based Pagination (Phân trang theo con trỏ)
Cách hoạt động
Phân trang theo con trỏ (cursor) sử dụng giá trị của bản ghi cuối cùng để xác định vị trí bắt đầu của trang kế tiếp, thay vì dùng offset.
SELECT * FROM products
WHERE created_at < '2025-10-31T12:00:00'
ORDER BY created_at DESC
LIMIT 10;
Output trả ra kèm con trỏ (cursor): nextCursor=MjAyNS0xMC0zMFQxNDowMzoyMQ==
Ưu điểm
- Hiệu suất cao: Tốc độ truy vấn nhanh hơn, đặc biệt với các tập dữ liệu lớn vì database chỉ cần tìm từ vị trí của con trỏ (cursor) thay vì phải quét qua nhiều bản ghi như offset pagination
 - Khả năng mở rộng tốt - Hoạt động hiệu quả khi xử lý lượng dữ liệu lớn, vì nó không bị suy giảm hiệu suất khi tăng số lượng trang được xem.
 - Kết quả nhất quán: Đảm bảo tính ổn định của dữ liệu trả về.
 - Phù hợp với UI cuộn tới chết (Infinite scroll)
 - Cursor được mã hóa (base64, jwt, hash)
 
Nhược điểm
- Cài đặt phức tạp hơn offset.
 - Không hỗ trợ điều hướng linh hoạt, người dùng buộc phải lấy dữ liệu tuần tự.
 
Gợi ý sử dụng
- Dữ liệu lớn, cập nhật thường xuyên.
 - Hệ thống cần hiệu năng cao và độ chính xác cao.
 - Ứng dụng có UI sử dụng infinite scroll.
 
3. Keyset Pagination (Phân trang theo khóa)
Cách hoạt động
Keyset pagination là một dạng đặc biệt của cursor-based pagination, dùng khóa duy nhất có thứ tự (như id, created_at,...) làm điểm phân trang. Trong thực tế, khá nhiều người dùng 2 thuật ngữ này để thay thế cho nhau do cách thức implement khá giống nhau.
SELECT * FROM orders
WHERE id > 500
ORDER BY id ASC
LIMIT 20;
Trang tiếp theo bắt đầu từ id=520
Ưu điểm
- Về cơ bản nó sẽ có toàn bộ ưu điểm của cursor-based pagination
 
Nhược điểm
- Cũng như ưu điểm, nó cũng có nhược điểm giống cursor-based pagination.
 - Không mã hóa cursor nên client có thể thấy được giá trị đang sử dụng.
 
Gợi ý sử dụng
- Hệ thống log, timeline, hoặc dữ liệu tuần tự
 - Các ứng dụng có truy vấn lớn, cần hiệu năng cao.
 - Nên sử dụng cho internal system, cursor-based nên sử dụng cho public APIs.
 
Kết luận
Không có loại phân trang nào là “tốt nhất cho mọi trường hợp” — lựa chọn phụ thuộc vào mục đích sử dụng và quy mô dữ liệu.
All rights reserved