Nếu tôi chạy truy vấn mongo từ trình bao với giải thích(), hãy lấy tên của chỉ mục được sử dụng và sau đó chạy lại cùng một truy vấn, nhưng với gợi ý() chỉ định cùng một chỉ mục được sử dụng - trường "millis" từ giải thích kế hoạch được giảm đáng kểTại sao gợi ý Mongo làm cho truy vấn chạy nhanh hơn gấp 10 lần?
ví dụ
không cung cấp gợi ý:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 24,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
gợi ý cung cấp:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 2,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
Sự khác biệt duy nhất là trường "millis"
Có ai biết tại sao không?
CẬP NHẬT: "Chọn chỉ mục để sử dụng" không giải thích được, bởi vì mongo, theo như tôi biết, hãy chọn chỉ mục cho mỗi lần chạy X (100?), Vì vậy nó phải nhanh như gợi ý tiếp theo (X-1) chạy
Hoặc là chỉ số được tăng tốc mọi thứ lên đó nhiều, hoặc bạn chỉ cần tái thực hiện một truy vấn lưu trữ, trong đó có nhiều hơn thế thấp hơn rất nhiều chi phí. –
Tôi không nghĩ đó là do bộ nhớ đệm. Nếu tôi chạy cùng một truy vấn mà không có gợi ý 2, 3 hoặc 10 lần, nó sẽ không nhanh hơn nhiều, nhưng nó luôn tăng tốc đáng kể với gợi ý. –
Bạn có thể chỉnh sửa câu hỏi của mình để bao gồm đầu ra của tìm (...). Giải thích (đúng) không có gợi ý. Điều đó sẽ in thêm thông tin có thể giúp gỡ lỗi này. – mstearn