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 records returned (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. 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 $limitmệnh đề. Đ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 qua 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 sắp xếp và hiện thực hoá đầ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ả

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 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 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 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 đây để 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ã 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 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 sử 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, sau đó là một nút 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 một 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 chỉ mục nhiều khoá được sử 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 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 không thể sử dụng chỉ mục được dùng để đá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.

Chỉ mục cho $lookup

Để cải thiện hiệu suất của giai đoạn $lookup, hãy tạo một chỉ mục trên foreignField trong bộ sưu tập from. Điều này cho phép thao tác kết hợp tìm thấy các tài liệu phù hợp một cách hiệu quả trong bộ sưu tập from mà không cần quét toàn bộ bộ sưu tập.

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 nhau. Để 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 nhau 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 nhau 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 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 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 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.