0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

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

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

• 5 phút đọc

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:

Copy
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:

Copy
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

  1. 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.

    Copy
    SELECT * FROM my_table WHERE type = 'bank' AND isDeleted = 0 ORDER BY id LIMIT 50;
  2. 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.

  3. 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ụng OFFSET, 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.

    Copy
    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)

Copy
-- 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)

Copy
-- 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

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