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 Giải thích truy vấn để 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ó trả về nhiều tài liệu hay không. Hãy 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 chuyển đổi tuần tự của kết quả khi trả về cho ứng dụng qua mạng. Trong trường hợp nút Limit đứng trước nút MajorSort, công cụ truy vấn có thể kết hợp nút Limit và nút MajorSort, đồng thời thay thế một quá trình cụ thể hoá và sắp xếp đầy đủ trong bộ nhớ bằng một quá trình 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ả

Hãy 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ớ khi xử lý kết quả trung gian, cũng như kích thước byte được chuyển đổi tuần tự của kết quả khi trả về cho ứng dụng qua 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 phủ bởi một chỉ mục thông thường (không phải đa khoá), điều này cũng cho phép truy vấn được bao phủ hoàn toàn bởi quá trình quét chỉ mục, tránh việc 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 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à nút TableScan, thì tức 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 một chỉ mục đang được sử dụng, 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ể tối ưu hoá hay không

Chỉ mục sẽ hữu ích cho một truy vấn nếu chỉ mục đó 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ủa chỉ mục đó 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 dùng cho một 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 một nút Quét trả về nhiều bản ghi, theo sau là một 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 đáp ứng bằng chỉ mục không có tính chọn lọc. Để tạo một chỉ mục phù hợp hơn, hãy xem phần Tạo chỉ mục.

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

Đang tối ưu hoá $lookup truy vấn

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

$lookup với localField và foreignField

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

$lookup có quy trình lồng nhau

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

  • Đố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 một chỉ mục trên các trường liên quan trong tập hợ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 một giá trị không đổi (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 một chỉ mục trên các trường liên quan trong tập hợp bên ngoài. Xin lưu ý rằng chỉ mục nhiều khoá sẽ không được sử dụng trong kế hoạch.

Tạo chỉ mục

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ủa bạn có thể sử dụng chỉ mục, hãy tạo chỉ mục thông thường (không phải Multikey) với các trường theo thứ tự sau:

  1. Tất cả các trường sẽ được 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ề tần suất 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 thứ tự).
  3. Các trường sẽ được dùng trong toán tử phạm vi hoặc bất đẳng thức theo thứ tự giảm dần của tính chọn lọc ràng buộc truy vấn.
  4. Các trường sẽ được trả về dưới dạng một phần của truy vấn trong chỉ mục: việc đưa các trường đó 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 Multikey.

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ề kết quả của một truy vấn được thực thi bằng tính năng Giải thích truy vấn, hãy xem phần Tài liệu tham khảo về việc thực thi truy vấn.