2011-11-02 26 views
7

Tôi hiểu rằng với MongoDB, để truy vấn sử dụng chỉ mục phức hợp, nó phải sử dụng TẤT CẢ các khóa trong chỉ mục hoặc ít nhất một số khóa bắt đầu từ bên trái. Ví dụ:Chỉ mục phức hợp Mongo, sử dụng ít hơn tất cả trong truy vấn

db.products.find({ "a":"foo", "b":"bar" }) 

Sẽ vui vẻ sử dụng chỉ mục được tạo thành từ {a, b, c}.

Tuy nhiên, nếu tôi muốn truy vấn:

db.products.find({"a":"foo", "c":"thing" }) 

Tôi tin rằng điều này không thể sử dụng các chỉ số. Điều này có thể được giải quyết bằng cách thêm điều kiện tầm thường vào "b", ví dụ:

db.products.find({"a":"foo", "b":{ $ne : "" }, "c":"thing" }) 

Ngay cả khi tôi không thực sự quan tâm đến giá trị của b. Lý do cho điều này là chúng ta hiện có 45m đối tượng và nó sẽ tiếp tục phát triển vì vậy chúng tôi đang tìm cách củng cố các chỉ mục của mình để tiết kiệm tài nguyên.

Rất cám ơn.

+0

Bạn có thể cho giải thích của các truy vấn này? –

+0

Sự hiểu biết của bạn là đúng trên một chỉ số hợp chất kép, nhưng không nhất thiết phải đúng trong một chỉ số hợp chất ba. Sử dụng giải thích, bạn sẽ thấy rằng chỉ số a, b, c trên thực tế sẽ được sử dụng khi bạn truy vấn trên a, c. –

Trả lời

3

Nói chung, truy vấn trên chỉ mục nhiều cột không đủ giới hạn đối sánh cho một trong các cột sẽ giới hạn tính hữu ích của chỉ mục nhiều cột. Trong ví dụ của bạn, việc sử dụng tiêu chí truy vấn của {"a":"foo", "b":{$ne:""}, "c":"thing"} sẽ giới hạn tính hữu dụng của chỉ mục {a,b,c} để chỉ đối sánh trên a. Nếu tiêu chí truy vấn của bạn sẽ được thực hiện thường xuyên, hãy tạo chỉ mục {a,c,b} (hoặc {a,c} nếu b sẽ không được sử dụng trong tiêu chí truy vấn).

Sử dụng chức năng explain trên truy vấn của bạn để xem liệu chỉ mục có đang được sử dụng hết tiềm năng hay không. Nếu explain cho bạn biết indexOnlytrue, thì truy vấn của bạn chỉ sử dụng chỉ mục để tìm tài liệu phù hợp; nếu không, MongoDB cần xem xét từng tài liệu để tìm các kết quả phù hợp.

Để biết thêm thông tin, xem:

0

Trong thực tế, sử dụng các phiên bản Mongo mới hơn, bạn {a, b, c} index sẽ được sử dụng khi có truy vấn trên {a, c} không có điều kiện tầm thường trên b cần thiết. Tôi đã xác minh điều này bằng cách sử dụng lệnh giải thích.

Có một cuộc thảo luận chi tiết về đây này: Mongo Triple Compound Index

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