Phân Trang Keyset (Truy Vấn Theo Last ID) – Giải Pháp Tối Ưu Cho Hiệu Suất Dữ Liệu Lớn
Khi làm việc với các cơ sở dữ liệu lớn, việc tối ưu hóa các truy vấn luôn là một thách thức lớn. Đặc biệt, với những bảng dữ liệu chứa hàng triệu bản ghi, sử dụng phương pháp phân trang truyền thống với OFFSET
thường dẫn đến tình trạng chậm chạp. Để khắc phục vấn đề này, Phân Trang Keyset (hay còn gọi là truy vấn theo Last ID) là một kỹ thuật hữu ích mà mình muốn giới thiệu đến các bạn.
Thách Thức Với Phân Trang Truyền Thống (OFFSET)
Phương pháp truyền thống trong việc phân trang dữ liệu thường sử dụng cú pháp LIMIT
kết hợp với OFFSET
. Ví dụ, để lấy 50 bản ghi đầu tiên trong bảng, ta sẽ thực hiện truy vấn như sau:
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50 OFFSET 0;
Để lấy 50 bản ghi tiếp theo, ta cần tăng giá trị OFFSET
:
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50 OFFSET 50;
Vấn đề nghiêm trọng phát sinh khi bảng dữ liệu trở nên lớn: Việc sử dụng OFFSET
khiến cơ sở dữ liệu phải bỏ qua một số lượng bản ghi nhất định trước khi trả về kết quả. Trong thực nghiệm của tôi với 70 triệu bản ghi, rõ ràng thấy hiệu suất của phương pháp này giảm rất nhanh.
Giải Pháp: Phân Trang Keyset (Truy Vấn Theo Last ID)
Phân Trang Keyset giúp cải thiện hiệu suất truy vấn khi xử lý dữ liệu lớn. Thay vì sử dụng OFFSET
, phương pháp này dựa trên giá trị ID
của bản ghi cuối cùng từ lần truy vấn trước đó để truy vấn các bản ghi tiếp theo. Điều này cho phép cơ sở dữ liệu không phải quét qua các bản ghi không cần thiết, tiết kiệm rất nhiều thời gian.
Cách Hoạt Động Của Phân Trang Keyset
-
Lấy một số lượng bản ghi nhất định: Đầu tiên, thao tác cần làm là lấy 50 bản ghi được sắp xếp theo thứ tự tăng dần theo cột
ID
.SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50;
-
Lưu giá trị
ID
của bản ghi cuối cùng: Sau khi có kết quả, bạn sẽ lưu giữ giá trịID
của bản ghi cuối cùng để sử dụng cho lần truy vấn tiếp theo. -
Truy Vấn Các Bản Ghi Tiếp Theo Dựa Trên
lastId
: Trong lần truy vấn kế tiếp, thay vì sử dụngOFFSET
, chỉ cần truy vấn các bản ghi cóID
lớn hơn giá trịID
cuối cùng từ lần truy vấn trước.SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 AND id > lastId ORDER BY id LIMIT 50;
Phương pháp này giúp cơ sở dữ liệu không cần phải quét toàn bộ các bản ghi để loại bỏ những bản ghi đã bỏ qua, từ đó tăng tốc độ truy vấn một cách đáng kể.
So Sánh Giữa Phân Trang Truyền Thống Và Phân Trang Keyset
Phân Trang Truyền Thống (OFFSET)
-- Lấy 50 bản ghi đầu tiên
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50 OFFSET 0;
-- Lấy 50 bản ghi tiếp theo
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50 OFFSET 50;
-- Lấy thêm 50 bản ghi nữa
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50 OFFSET 100;
Nhược điểm:
- Khi giá trị
OFFSET
tăng lên, hiệu suất giảm sút do phải bỏ qua nhiều bản ghi hơn. - Không hiệu quả khi làm việc với những bảng dữ liệu lớn.
Phân Trang Keyset (Truy Vấn Theo Last ID)
-- Lấy 50 bản ghi đầu tiên
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50;
-- Lấy 50 bản ghi tiếp theo dựa trên lastId (ID cuối cùng của kết quả trước)
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 AND id > lastId ORDER BY id LIMIT 50;
-- Lặp lại cho các bản ghi tiếp theo
SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 AND id > lastId ORDER BY id LIMIT 50;
Ưu điểm:
- Giữ hiệu suất ổn định ngay cả khi làm việc với bảng dữ liệu lớn.
- Truy vấn diễn ra nhanh chóng hơn vì không cần quét lại các bản ghi đã bỏ qua.
Thử Nghiệm Thực Tế
Trong thực tế, tôi đã thử nghiệm với bảng chứa 70 triệu bản ghi và nhận thấy rằng Phân Trang Keyset mang lại hiệu suất vượt trội so với phương pháp OFFSET
. Khi khối lượng dữ liệu ngày càng tăng, phương pháp OFFSET
chậm đi đáng kể, trong khi Phân Trang Keyset vẫn duy trì tốc độ truy vấn ổn định.
Khi Nào Nên Áp Dụng Phân Trang Keyset?
- Khi cần phân trang dữ liệu lớn.
- Khi muốn tăng tốc độ truy vấn và tránh việc cơ sở dữ liệu phải quét qua nhiều bản ghi không cần thiết.
- Khi cột
ID
hoặc khóa chính của bảng là duy nhất và liên tục.
Kết Luận
Phân Trang Keyset thật sự là một kỹ thuật hiệu quả trong việc tối ưu hóa xử lý dữ liệu lớn. Bằng cách sử dụng giá trị ID
để phân trang thay vì áp dụng OFFSET
, phương pháp này giúp nâng cao hiệu suất truy vấn, đảm bảo tốc độ cũng như tính ổn định trong thời gian truy vấn, ngay cả khi làm việc với bảng dữ liệu lớn như 70 triệu bản ghi. Nếu bạn đang gặp khó khăn với tốc độ truy vấn dữ liệu lớn, hãy thử áp dụng kỹ thuật này, bạn sẽ nhận thấy sự cải thiện đáng kể!
source: viblo