- vừa được xem lúc

[Database] Hiệu Suất Phân Trang Xâu Trong SQL Database

0 0 12

Người đăng: Duy Võ

Theo Viblo Asia

Phân trang là một kỹ thuật phổ biến trong quản lý dữ liệu lớn để chia nhỏ kết quả truy vấn thành các trang, giúp cải thiện trải nghiệm người dùng và giảm tải hệ thống. Tuy nhiên, khi dữ liệu ngày càng lớn, việc phân trang xâu (pagination) trở nên phức tạp và yêu cầu tối ưu hóa để đảm bảo hiệu suất. Trong bài viết này, chúng ta sẽ thảo luận về lệnh truy vấn SQL để tăng hiệu suất trong bài toán phân trang xâu.

Lệnh Truy Vấn

1. Ví dụ 1:

SELECT *
FROM table_test
ORDER BY created_at
OFFSET 950000
LIMIT 20;

Thời gian truy vấn:

Với lệnh truy vấn trên, tôi thử lại 3 lần liên tục và cho ra kết quả:

  • Lần 1: 2.518s
  • Lần 2: 2.425s
  • Lần 3: 2.446s

Truy vấn này sắp xếp tất cả các hàng trong table_test theo created_at, sau đó bỏ qua 950,000 hàng đầu tiên và trả về 20 hàng tiếp theo. Quá trình này tiêu tốn nhiều tài nguyên, đặc biệt là khi số lượng hàng bỏ qua lớn. Đây là một trong những nguyên nhân chính gây ra hiệu suất chậm khi sử dụng OFFSET lớn.

2. Ví dụ 2:

SELECT t.*
FROM table_test t
INNER JOIN ( SELECT id FROM table_test ORDER BY created_at OFFSET 950000 LIMIT 20
) subquery
ON t.id = subquery.id
ORDER BY t.created_at;

Trong ví dụ lần này, Cơ sở dữ liệu thực hiện sắp xếp giá trị cột created_at và bỏ qua 950,000 hàng đầu tiên, lấy id của 20 hàng tiếp theo. Kết quả của subquery là một tập hợp các id. Tiếp theo thực hiện JOIN giữa table_test và kết quả của subquery bằng cách khớp id và cho ra kết quả.

Thời gian truy vấn:

Với lệnh truy vấn trên, tôi thử lại 3 lần liên tục và cho ra kết quả:

  • Lần 1: 580s
  • Lần 2: 566s
  • Lần 3: 550s

Có thể thấy thời gian truy vấn giảm đi 4.34 lần so với truy vấn ban đầu, hiệu xuất tăng lên đáng kể.

Tại Sao Lệnh Truy Vấn Này Nhanh Hơn

  1. Giảm Số Lượng Hàng Xử Lý:
  • Subquery chỉ lấy id của 20 hàng sau khi bỏ qua 950,000 hàng. Điều này giới hạn số lượng dữ liệu phải xử lý trong bước đầu tiên, giảm tải công việc cho cơ sở dữ liệu.
  • Việc lấy chỉ id (một cột) nhanh hơn nhiều so với việc lấy toàn bộ hàng (SELECT ).
  1. Tối Ưu Hóa Sắp Xếp:
  • Việc sắp xếp và bỏ qua hàng trong subquery diễn ra trên tập hợp dữ liệu nhỏ hơn (chỉ cột id), nhanh hơn so với sắp xếp toàn bộ hàng trong bảng.
  • Sau đó, JOIN chỉ trên 20 hàng kết quả từ subquery, giúp giảm tải công việc cho bước JOIN và sắp xếp cuối cùng.
  1. Sử Dụng Chỉ Mục Hiệu Quả:
  • Cột id có chỉ mục, JOIN trên id sẽ diễn ra nhanh hơn. Cơ sở dữ liệu có thể tận dụng chỉ mục để nhanh chóng truy xuất các hàng tương ứng.

Kết Luận

Quản lý hiệu suất trong bài toán phân trang xâu đòi hỏi sự cân nhắc kỹ lưỡng và áp dụng các chiến lược tối ưu hóa. Sử dụng các kỹ thuật như subquery, chỉ mục và cache có thể giúp cải thiện hiệu suất truy vấn trong cơ sở dữ liệu lớn. Quan trọng nhất, việc hiểu rõ cấu trúc dữ liệu và các chỉ số hiệu suất sẽ giúp lựa chọn chiến lược phù hợp nhất cho từng trường hợp cụ thể.

Bình luận

Bài viết tương tự

- vừa được xem lúc

JSON Server 10 - Tìm cách custom output cho endpoint listing ?

Cách mình tư duy đi tìm lời giải cho việc custom output cho endpoint listing của JSON Server . . #json_server. #nodejs.

0 0 44

- vừa được xem lúc

Pagination: Có Thể Bạn Đang Làm Chưa Đúng Cách

Pagination? No problem! SELECT ... LIMIT X, Y Right. Bạn thấy đấy, logic trên không ổn định, nó có thể xảy ra vấn đề trong các app sử dụng ajax, hoặc infinite scroll.

0 0 249

- vừa được xem lúc

Kiểm tra query params và chuyển đổi kiểu dữ liệu khi làm API với NestJS

Dạo này mình đang học một cái gì đó mới. Vì cũng đang làm việc ở backend với vai trò chính là CRUD cho dự án cùng Django, nên mình chọn một cách làm backend khác, với một ngôn ngữ khác, đó chính là Ne

0 0 49

- vừa được xem lúc

Xây dựng tính năng phân trang với Angular 13

1. Giới thiệu.

0 0 3.6k

- vừa được xem lúc

Cách hiển thị hiệu quả các bảng dữ liệu lớn: Tối ưu hóa hiệu suất từ 12 phút đến 300 mili giây

Xin chào mọi người!!! MayFest đã trở lại, và mình cũng trở lại rồi đây. Dự án mà mình cần optimize có chứa 1 bảng dữ liệu để lưu log.

0 0 30

- vừa được xem lúc

Setup Boilerplate cho dự án NestJS - Phần 9: Tất tần tật về Pagination với MongoDB 📖

Đây là bài viết nằm trong Series NestJS thực chiến, các bạn có thể xem toàn bộ bài viết ở link: https://viblo.asia/s/nestjs-thuc-chien-MkNLr3kaVgA.

0 0 21