Điều này đã được giải thích trong allPlansExecution Mode trang tài liệu. Để diễn giải:
Trong quá trình lựa chọn kế hoạch, nếu có nhiều hơn một chỉ mục có thể đáp ứng một truy vấn, MongoDB sẽ chạy thử bằng cách sử dụng tất cả các kế hoạch hợp lệ để xác định chỉ mục nào được thực hiện là tốt nhất. Xem Kế hoạch truy vấn để biết chi tiết về quy trình này.
Kể từ MongoDB 3.4.6, việc lựa chọn kế hoạch liên quan đến việc chạy các kế hoạch ứng viên song song trong một "cuộc đua" và xem kế hoạch ứng viên nào trả về 101 kết quả đầu tiên. Trong ví dụ của bạn ở trên, vào thời điểm phương án thắng trả về 101 kết quả trong cuộc đua, phương án thua chỉ có 2 kết quả. Kế hoạch chiến thắng sau đó được thực hiện để hoàn thành. Đây là lý do tại sao kế hoạch thua cuộc chỉ hiển thị nReturned: 2
trong số liệu thống kê.
"Cuộc đua" này được thực hiện vì nếu có hai kế hoạch trông giống nhau, MongoDB không biết kế hoạch nào là tốt nhất cho một truy vấn cụ thể do tính linh hoạt của tài liệu JSON (không giống như SQL, nơi cấu trúc của các bảng được biết đến) . Tất nhiên, hoàn toàn có khả năng MongoDB đoán sai và kết thúc với một kế hoạch kém hiệu quả, vì đó là một quá trình thực nghiệm. Vì lý do này, tốt nhất bạn nên tạo các chỉ mục hỗ trợ các truy vấn của bạn để MongoDB không phải đoán. Nếu không, bạn có thể sử dụng hint()
để cho MongoDB biết chỉ mục nào sẽ sử dụng cho một truy vấn nhất định.
Do đó:
- Thống kê cho kế hoạch chiến thắng là thống kê kết quả thực tế của truy vấn.
- Thống kê cho (các) kế hoạch thua cuộc chỉ hiển thị thống kê cho quá trình chạy thử lập kế hoạch truy vấn.
- Việc lựa chọn kế hoạch liên quan đến việc chạy một "cuộc đua" đến 101 kết quả. Cuộc đua này chỉ được thực hiện khi có nhiều chỉ mục có thể đáp ứng truy vấn.
Lưu ý 1 :Cả hai kế hoạch bạn thấy đều không tuyệt vời. Kế hoạch chiến thắng hiển thị "nReturned" : 43
, "totalKeysExamined" : 221
và "totalDocsExamined" : 219
. Điều này có nghĩa là MongoDB chỉ cần kiểm tra 219 tài liệu để trả về 43 tài liệu trong số đó: chỉ 20% hiệu quả . Tốt nhất, bạn muốn có nReturned
số bằng totalDocsExamined
.
Lưu ý 2 :Thử tạo chỉ mục kết hợp {'rack_name': 1, 'timestamp': 1}
. Với cùng một truy vấn, bạn sẽ nhận được số hiệu quả cao hơn.
Lưu ý 3 :Lưu ý rằng vì allPlansExecution
đã được chỉ định, tất cả số liệu thống kê được MongoDB trả lại cho bạn một cách hợp lệ để đảm bảo tính kỹ lưỡng, trong khi nó không liên quan gì đến nReturned
cuối cùng kết quả. Đó là một kế hoạch bị từ chối và nReturned: 2
số có thể khó hiểu. Bạn sẽ không thấy thống kê này nếu bạn sử dụng executionStats
cài đặt. Chủ yếu, allPlansExecution
được sử dụng để tinh chỉnh và xác định lý do tại sao một số kế hoạch bị từ chối.