Tối ưu hoá hiệu suất truy vấn

Để khắc phục sự cố truy vấn chậm, hãy sử dụng Query Explain để lấy kế hoạch thực thi truy vấn và hồ sơ thực thi thời gian chạy. Phần sau đây mô tả các bước bạn có thể thực hiện để tối ưu hoá hiệu suất truy vấn tuỳ thuộc vào hồ sơ thực thi:

Giới hạn số lượng kết quả

Sử dụng trường bản ghi được trả về trong cây thực thi để xác định xem truy vấn có đang trả về nhiều tài liệu hay không. Cân nhắc việc giới hạn số lượng tài liệu được trả về bằng cách sử dụng mệnh đề $limit. Điều này giúp giảm kích thước byte được tuần tự hoá của kết quả khi được trả về cho ứng dụng trên mạng. Trong trường hợp nút Limit được đặt trước nút MajorSort, công cụ truy vấn có thể kết hợp các nút LimitMajorSort và thay thế quá trình hiện thực hoá và sắp xếp đầy đủ trong bộ nhớ bằng một kiểu sắp xếp TopN, giúp giảm yêu cầu về bộ nhớ cho truy vấn.

Giới hạn kích thước tài liệu kết quả

Cân nhắc việc giới hạn kích thước của tài liệu được trả về bằng cách sử dụng mệnh đề $project để tránh tìm nạp các trường không cần thiết. Điều này giúp giảm chi phí tính toán và bộ nhớ để xử lý kết quả trung gian và kích thước byte được tuần tự hoá của kết quả khi được trả về cho ứng dụng trên mạng. Trong trường hợp tất cả các trường được tham chiếu trong truy vấn đều được bao gồm trong một chỉ mục thông thường (không phải chỉ mục nhiều khoá), điều này cũng cho phép truy vấn được bao gồm đầy đủ trong quá trình quét chỉ mục, tránh phải tìm nạp tài liệu từ bộ nhớ chính.

Sử dụng chỉ mục

Hãy làm theo các hướng dẫn sau để thiết lập và tối ưu hoá chỉ mục.

Xác định xem truy vấn có đang sử dụng chỉ mục hay không

Bạn có thể xác định xem truy vấn có đang sử dụng chỉ mục hay không bằng cách kiểm tra các nút lá trong cây thực thi. Nếu nút lá của cây thực thi là một nút TableScan, thì điều đó có nghĩa là truy vấn không sử dụng chỉ mục và đang quét tài liệu từ bộ nhớ chính. Nếu đang sử dụng chỉ mục, thì nút lá của cây thực thi sẽ hiển thị mã nhận dạng chỉ mục và các trường chỉ mục của chỉ mục.

Xác định xem chỉ mục được sử dụng có thể được tối ưu hoá hay không

Chỉ mục hữu ích cho truy vấn nếu có thể giảm số lượng tài liệu mà công cụ truy vấn cần tìm nạp từ bộ nhớ chính hoặc nếu thứ tự trường có thể đáp ứng yêu cầu Sắp xếp của truy vấn.

Nếu một chỉ mục được sử dụng cho truy vấn, nhưng công cụ truy vấn vẫn đang tìm nạp và loại bỏ nhiều tài liệu (được xác định bằng nút Quét trả về nhiều bản ghi, sau đó là nút Bộ lọc trả về ít bản ghi), thì đây là dấu hiệu cho thấy vị từ truy vấn được thoả mãn bằng chỉ mục không có tính chọn lọc. Để tạo chỉ mục phù hợp hơn, hãy xem bài viết Tạo chỉ mục.

Nếu một chỉ mục không phải nhiều khoá được sử dụng cho truy vấn, nhưng công cụ truy vấn vẫn đang thực hiện việc sắp xếp lại tập kết quả trong bộ nhớ (được xác định bằng nút MajorSort trong cây thực thi truy vấn), thì đây là dấu hiệu cho thấy không thể sử dụng chỉ mục đã dùng để đáp ứng yêu cầu Sắp xếp của truy vấn. Để tạo chỉ mục phù hợp hơn, hãy xem phần tiếp theo.

Tối ưu hoá truy vấn $lookup

Bạn có thể tối ưu hoá truy vấn $lookup bằng cách thêm chỉ mục vào bộ sưu tập from, cho phép thao tác tìm thấy các tài liệu phù hợp một cách hiệu quả mà không cần quét toàn bộ bộ sưu tập.

$lookup với localFieldforeignField

Nếu bạn đang sử dụng các tuỳ chọn localFieldforeignField trong giai đoạn $lookup, hãy tạo chỉ mục trên foreignField trong bộ sưu tập from.

$lookup với các quy trình lồng nhau

Nếu bạn đang sử dụng tuỳ chọn pipeline trong giai đoạn $lookup với các giai đoạn $match, hãy tạo chỉ mục trên các trường liên quan đến bộ sưu tập bên ngoài để tránh quét toàn bộ bảng:

  • Đối với các giai đoạn $match có ngữ nghĩa bộ lọc (ví dụ: {$match: {a: true}}), hãy tạo chỉ mục trên các trường liên quan đến bộ sưu tập bên ngoài (a).
  • Đối với các giai đoạn $match có ngữ nghĩa tổng hợp so sánh một trường với giá trị hằng số (ví dụ: {$match: {$expr: {$gt: [a, 10]}}}) hoặc với các phép so sánh bằng (eq hoặc in) giữa các trường và biến được xác định trong let (ví dụ: {$match: {$expr: {$eq: [a, "$$a"]}}}), hãy tạo chỉ mục trên các trường liên quan đến bộ sưu tập bên ngoài. Xin lưu ý rằng chỉ mục nhiều khoá sẽ không được sử dụng trong quá trình lập kế hoạch.

Tạo chỉ mục

Hãy làm theo tài liệu quản lý chỉ mục để tạo chỉ mục. Để đảm bảo truy vấn có thể sử dụng chỉ mục, hãy tạo chỉ mục thông thường (không phải chỉ mục nhiều khoá) với các trường theo thứ tự sau:

  1. Tất cả các trường sẽ được sử dụng trong toán tử bằng. Để tối đa hoá cơ hội sử dụng lại trên các truy vấn, hãy sắp xếp các trường theo thứ tự giảm dần về số lần xuất hiện của các trường trong toán tử bằng giữa các truy vấn.
  2. Tất cả các trường sẽ được sắp xếp (theo cùng một thứ tự).
  3. Các trường sẽ được sử dụng trong toán tử phạm vi hoặc toán tử không bằng theo thứ tự giảm dần về tính chọn lọc của ràng buộc truy vấn.
  4. Các trường sẽ được trả về như một phần của truy vấn trong chỉ mục: việc đưa các trường như vậy vào chỉ mục cho phép chỉ mục bao gồm truy vấn và tránh phải tìm nạp tài liệu từ bộ nhớ chính.

Đối với các truy vấn liên quan đến việc lọc và sắp xếp các trường mảng, hãy cân nhắc việc tạo chỉ mục nhiều khoá.

Sử dụng gợi ý truy vấn

Nếu đã tạo một chỉ mục phù hợp hơn cho truy vấn nhưng công cụ truy vấn không sử dụng chỉ mục đó, bạn có thể ghi đè lựa chọn ưu tiên về chỉ mục của công cụ truy vấn bằng cách sử dụng gợi ý truy vấn.

Để biết thêm thông tin về đầu ra của truy vấn được thực thi bằng Query Explain (Giải thích truy vấn), hãy xem bài viết Tài liệu tham khảo về thực thi truy vấn.