Một vài điểm chính từ kết quả giải thích kế hoạch:
- Truy vấn giải quyết các thuộc tính sau:
siteId, status, creationDate, reportCount, assignee, parent
- Kế hoạch chiến thắng có hai giai đoạn:
- IX_SCAN sử dụng
creationDate_1_reportCount_1_label_1
, điều này sử dụng tra cứu được lập chỉ mục trêncreationDate
vàreportCount
để xác định 56 tài liệu sau đó được chuyển tiếp đến giai đoạn FETCH - FETCH nhận 56 tài liệu từ giai đoạn IX_SCAN và sau đó thẩm vấn các tài liệu này để áp dụng
siteId
,status
,assignee
vàparent
bộ lọc. Cuộc thẩm vấn này khiến 37 tài liệu bị hủy và 19 tài liệu được trả lại.
- IX_SCAN sử dụng
Vì vậy, chỉ mục của bạn chỉ bao gồm 2 trong số 6 thuộc tính trong truy vấn của bạn và 4 thuộc tính còn lại trong truy vấn của bạn được áp dụng bằng cách kiểm tra tài liệu không phải chỉ mục . Nếu bạn muốn truy vấn này được lập chỉ mục đầy đủ thì hãy tạo chỉ mục sau:
db.collection.createIndex(
{siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
)
Nếu bạn chạy lại với chỉ mục này tại chỗ thì bạn sẽ thấy rằng (a) MongoDB chọn chỉ mục này và (b) số lượng tài liệu được chuyển tiếp bởi giai đoạn IX_SCAN cũng giống như số lượng tài liệu được trả về bởi cuộc gọi tìm kiếm của bạn.
Tôi nói "nên tìm" bởi vì có những khía cạnh khác ở đây có thể dẫn đến việc MongoDB chọn một chỉ mục khác, ví dụ:sử dụng $nor
và giai đoạn sắp xếp (creationDate: 1
). Tôi khuyên bạn nên tinh chỉnh chỉ mục và chạy với giải thích 'bật' sau mỗi lần chỉnh sửa và tìm kiếm các mục chính này trong executionStats
tài liệu phụ:
- "nReturned"
- "totalKeysExamined"
- "totalDocsExamined"
Một quy tắc chung đơn giản là:totalKeysExamined
càng gần là nReturned
và totalDocsExamined
càng gần bằng 0 ... mức độ phù hợp chỉ mục của bạn càng tốt.
Ngoài ra còn có câu hỏi về chi phí của một chỉ mục (về tác động đến thời gian ghi và lưu trữ chỉ mục), vì vậy tôi khuyên bạn nên xem xét các yêu cầu phi chức năng của bạn - liệu thời gian trôi qua mong muốn của bạn có thể đạt được mà không có đầy đủ chỉ mục không? Nếu không, thì bạn nên tiến hành thử nghiệm thực nghiệm nhưng hãy chuẩn bị để điều chỉnh lựa chọn của bạn để đáp ứng những gì explain()
đầu ra cho bạn biết.