2011-10-11 28 views
17

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

+3

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í. –

+0

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 ý. –

+0

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

Trả lời

17

Mongo sử dụng một thuật toán để xác định chỉ số được sử dụng khi không có gợi ý được cung cấp và sau đó lưu trữ các chỉ số được sử dụng để truy vấn tương tự cho tới 1000 gọi

Nhưng bất cứ khi nào bạn giải thích một truy vấn Mongo nó sẽ luôn luôn chạy thuật toán lựa chọn chỉ mục, do đó giải thích() với gợi ý sẽ luôn mất ít thời gian hơn khi so sánh với giải thích() mà không có gợi ý.

câu hỏi tương tự đã được trả lời ở đây Understanding mongo db explain

+0

Âm thanh hợp lý. Bạn có bất kỳ tham chiếu đến tài liệu? –

+0

http://stackoverflow.com/questions/12510974/understanding-mongo-db-explain –

+2

"Ngoài ra, thao tác giải thích $ sẽ đánh giá lại một tập hợp các kế hoạch truy vấn ứng viên, điều này có thể làm cho thao tác $ giải thích hoạt động khác với truy vấn thông thường Do đó, các hoạt động này thường cung cấp một tài khoản chính xác về cách MongoDB thực hiện truy vấn, nhưng không phản ánh độ dài của các truy vấn này. kế hoạch truy vấn. " Trích xuất từ ​​http://docs.mongodb.org/manual/reference/operator/explain/#op._S_explain –

6

Mongo đã thực hiện tìm kiếm tương tự cả hai lần như bạn có thể thấy từ số lượng đối tượng được quét. Ngoài ra, bạn có thể thấy rằng chỉ mục đã sử dụng giống nhau (hãy xem mục nhập "con trỏ"), cả hai đều đã sử dụng chỉ mục my_super_index của bạn.

"gợi ý" chỉ yêu cầu Mongo sử dụng chỉ mục cụ thể mà nó đã tự động thực hiện trong truy vấn đầu tiên.

Tìm kiếm thứ hai đơn giản nhanh hơn vì tất cả dữ liệu có thể đã có trong bộ nhớ cache.

+1

Điều này hoàn toàn chính xác. Truy vấn đầu tiên của bạn dài hơn do trang bị lỗi và tải dữ liệu từ đĩa. Để thực hiện thử nghiệm một cái gì đó như thế này, bạn cần phải chạy nó hàng ngàn lần trong tất cả các loại trường hợp khác nhau tương tự như tải sản xuất của nó sẽ được và trung bình kết quả để thậm chí tiếp cận một điểm chuẩn chính xác. – marr75

+0

Một lưu ý, tuy nhiên, dữ liệu có nhiều khả năng không có trong "bộ nhớ cache", các tệp cơ sở dữ liệu là bộ nhớ được ánh xạ và vừa được tải vào bộ nhớ hệ thống. Mongo giữ mọi thứ đơn giản bằng cách ánh xạ bộ nhớ các tập tin của nó và cho phép hệ điều hành quyết định khi nào trao đổi các trang, hầu như luôn dựa trên tần suất và truy cập gần đây. – marr75

+0

xem phần CẬP NHẬT của tôi –

2

Tôi gặp khó khăn khi tìm lý do cho cùng một điều. Tôi thấy rằng khi chúng tôi có nhiều chỉ mục, mongo thực sự mất nhiều thời gian hơn là sử dụng gợi ý. Mongo về cơ bản mất rất nhiều thời gian để quyết định sử dụng chỉ mục nào. Hãy suy nghĩ về một kịch bản mà bạn có 40 chỉ mục và bạn thực hiện một truy vấn. Nhiệm vụ đầu tiên mà Mongo cần làm là chỉ mục nào phù hợp nhất để được sử dụng cho truy vấn cụ thể. Điều này sẽ ngụ ý mongo cần phải quét tất cả các phím cũng như thực hiện một số tính toán trong mỗi lần quét để tìm một số chỉ số performancce nếu phím này được sử dụng. gợi ý chắc chắn sẽ tăng tốc kể từ khi quét khóa chỉ mục sẽ được lưu.

+0

câu trả lời đơn giản là dễ hiểu –

Các vấn đề liên quan