0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Tìm Hiểu Về Phân Trang Dữ Liệu: Sự Khác Biệt Giữa Offset Và Cursor Pagination

Đăng vào 1 ngày trước

• 5 phút đọc

Tìm Hiểu Về Phân Trang Dữ Liệu: Sự Khác Biệt Giữa Offset Và Cursor Pagination

Khi phát triển hệ thống web hoặc API, việc phân trang dữ liệu là một yếu tố quan trọng trong việc cải thiện trải nghiệm người dùng. Trong bài viết này, chúng ta sẽ cùng nhau khám phá hai phương pháp phân trang phổ biến: Offset PaginationCursor Pagination. Bài viết sẽ giới thiệu về cách hoạt động của từng phương pháp, cũng như phân tích lý do vì sao Cursor Pagination lại thường được coi là lựa chọn tốt hơn so với Offset Pagination.

I. Tổng Quan Về Phân Trang Dữ Liệu

Phân trang là cách chia nhỏ dữ liệu thành các trang riêng biệt để người dùng có thể dễ dàng duyệt và tìm kiếm thông tin. Có nhiều phương pháp phân trang, nhưng hai phương pháp chủ yếu được sử dụng rộng rãi là Offset PaginationCursor Pagination.

1. Offset Pagination

Offset Pagination là phương pháp truyền thống nhất và dễ hiểu nhất. Cú pháp SQL cơ bản cho phép lấy dữ liệu từ một vị trí chỉ định với giới hạn số lượng bản ghi sẽ được trả về, ví dụ:

sql Copy
SELECT * FROM users ORDER BY id DESC LIMIT 10 OFFSET 20;

Câu lệnh này sẽ trả về 10 bản ghi bắt đầu từ bản ghi thứ 21. Tuy nhiên, phương pháp này có một số nhược điểm:

  • Hiệu suất giảm dần: Khi số lượng bản ghi lớn, việc sử dụng OFFSET sẽ khiến cơ sở dữ liệu phải quét qua nhiều bản ghi không cần thiết.
  • Không ổn định: Tình trạng dữ liệu thay đổi giữa các lần truy vấn có thể dẫn đến kết quả bị trùng lặp hoặc bỏ sót.

2. Cursor Pagination

Cursor Pagination sử dụng một con trỏ với giá trị duy nhất từ một cột (ví dụ: id hoặc timestamp) để xác định vị trí bắt đầu của trang tiếp theo. Thay vì đếm số bản ghi cần bỏ qua, bạn có thể truy vấn dễ dàng hơn với câu lệnh như sau:

sql Copy
SELECT * FROM users WHERE id > 100 ORDER BY id LIMIT 10;

Trong đó, giá trị id > 100 trở thành con trỏ nhằm giảm thời gian truy vấn.

II. Tại Sao Cursor Pagination Nhanh Hơn?

  • Tối ưu hiệu suất với index: Sử dụng con trỏ cho phép cơ sở dữ liệu truy xuất ngay lập tức các bản ghi mà không cần quét qua toàn bộ bảng.
  • Không phụ thuộc vào OFFSET: Việc giảm thiểu tính toán cần thiết khi không cần đếm và bỏ qua bản ghi khiến cho quá trình truy vấn hiệu quả hơn.
  • Ổn định khi dữ liệu thay đổi: Khi dữ liệu có sự thay đổi, Cursor Pagination không bị ảnh hưởng, điều này rất quan trọng trong các ứng dụng yêu cầu cập nhật dữ liệu thường xuyên.

III. Phân Tích Kế Hoạch Thực Thi SQL

Để so sánh hiệu suất giữa hai phương pháp, chúng ta sẽ sử dụng câu lệnh EXPLAIN ANALYZE với bảng ‘user_notes’ chứa 1 triệu bản ghi.

1. Offset Pagination

Kế hoạch thực thi cho truy vấn với Offset Pagination cho thấy thời gian thực thi lên tới 704.217 ms (0.7 giây), cho thấy rõ sự ảnh hưởng nặng nề của việc sử dụng OFFSET trong các truy vấn phức tạp.

2. Cursor Pagination

Truy vấn sử dụng Cursor Pagination cho thấy thời gian thực thi là 40.993 ms (0.04 giây), cho thấy sự vượt trội trong hiệu năng.

3. Tối Ưu Cursor Pagination

Đảm bảo rằng các cột làm con trỏ được đánh chỉ mục rất quan trọng khi áp dụng Cursor Pagination. Việc sử dụng các chỉ mục tổng hợp nên được lập ra để tối ưu hóa truy vấn.

IV. Khi Nào Nên Sử Dụng Cursor Pagination?

Tiêu chí Offset Pagination Cursor Pagination
Dữ liệu nhỏ
Cần hỗ trợ điều hướng
Dữ liệu lớn (> 100k bản ghi)
Yêu cầu tốc độ cao
Tránh dữ liệu bị trùng/sót

V. Kết Luận

Như đã phân tích, Cursor Pagination cung cấp giải pháp hiệu quả hơn cho những ứng dụng yêu cầu phân trang với khối lượng dữ liệu lớn và tốc độ truy vấn cao. Với khả năng đảm bảo tính ổn định và tốc độ khi dữ liệu thay đổi, kỹ thuật này là sự lựa chọn lý tưởng cho nhiều dự án phát triển hiện đại. Trong phần tiếp theo của bài viết, chúng ta sẽ đi sâu vào cách áp dụng Cursor Pagination trong ASP.NET, nhằm hỗ trợ bạn xây dựng hệ thống phân trang một cách hiệu quả và tiện lợi hơn.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào