2010-12-29 33 views
5

MongoDB có vẻ như nó đang sử dụng mẫu truy vấn không hiệu quả khi một chỉ mục là một tập con của một chỉ mục khác.Có thể chỉ định truy vấn nào sẽ sử dụng chỉ mục trong Mongoid không?

class Model 
    field :status, :type => Integer 
    field :title, :type => String 
    field :subtitle, :type => String 
    field :rating, :type => Float 

    index([ 
    [:status, Mongo::ASCENDING], 
    [:title, Mongo::ASCENDING], 
    [:subtitle, Mongo::ASCENDING], 
    [:rating, Mongo::DESCENDING] 
    ]) 
    index([ 
    [:status, Mongo::ASCENDING], 
    [:title, Mongo::ASCENDING], 
    [:rating, Mongo::DESCENDING] 
    ]) 
end 

Chỉ số đầu tiên đang được sử dụng cả khi truy vấn trên status, titlesubtitle và phân loại trên rating và khi truy vấn trên chỉ statustitle và phân loại trên rating mặc dù sử dụng explain() cùng với hint() ở các bang console javascript sử dụng chỉ mục thứ hai nhanh gấp 4 lần.

Làm thế nào tôi có thể yêu cầu Mongoid nói MongoDB sử dụng chỉ mục thứ hai?

Trả lời

7

Bạn có thể vượt qua các tùy chọn như gợi ý để sử dụng Mongo::CollectionMongoid::Criterion::Optional.extras

Một ví dụ:

criteria = Model.where(:status => true, :title => 'hello world').desc(:rating) 
criteria.extras(:hint => {:status => 1, :title => 1, :rating => -1}) 

extras chấp nhận bất cứ điều gì mà có thể xử lý Mongo::Collection

+0

Hm, thú vị. Theo như tôi biết mongodb chỉ có thể sử dụng một chỉ mục. Vì vậy, có một chút khó hiểu tại sao bạn đặt băm vào giá trị gợi ý của bạn – Ph0en1x

+0

Giá trị gợi ý băm có tương ứng với [[: trạng thái, Mongo :: ASCENDING], [: tiêu đề, Mongo :: ASCENDING], [: rating, Mongo: : DESCENDING]] chỉ mục, do đó, nó vẫn chỉ sử dụng một chỉ số duy nhất –

+0

vì vậy nó là chỉ số compaund? từ trạng thái, tiêu đề và xếp hạng. Ok, sau đó tôi thấy. – Ph0en1x

0

http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint

Trong khi truy vấn tối ưu Mongo thường thực hiện rất tốt, rõ ràng "gợi ý" có thể được sử dụng để buộc Mongo sử dụng một chỉ số quy định, có khả năng cải thiện hiệu suất trong một số tình huống.

db.collection.find({user:u, foo:d}).hint({user:1});

Bạn cần phải làm việc từ http://www.rdoc.info/github/mongoid/mongoid/master/Mongoid/Cursor ở đây là tôi không biết Ruby đủ. Nó đề cập đến gợi ý.

+0

Tôi không chắc chắn Mongoid :: Cursor là đường dẫn chính xác. Nó đại biểu gợi ý đến Mongo :: Cursor nơi gợi ý là một thuộc tính chỉ đọc. –

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