我注意到一個奇怪的行爲。它可能是mongoid或mongodb,我不確定,但計數文檔比讀取文檔慢。下面是我開的疑問:Mongoid:爲什麼提取計數比提取文檔慢
Institution.all.any_of(:portaled_at.ne => nil).any_of(portaled: true).order_by(:portaled_at.desc).count
# mongodb query and timing as per mongoid logs,
# times are consistent over multiple runs
# MONGODB (236ms) db['$cmd'].find({"count"=>"institutions", "query"=>{"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}, "fields"=>nil}).limit(-1)
# MONGODB (245ms) db['$cmd'].find({"count"=>"institutions", "query"=>{"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}, "fields"=>nil}).limit(-1)
Institution.all.any_of(:portaled_at.ne => nil).any_of(portaled: true).order_by(:portaled_at.desc).to_a
# mongodb query and timing as per mongoid logs
# times are not so consistent over multiple runs,
# but consistently much lower than count query
# MONGODB (9ms) db['institutions'].find({"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}).sort([[:portaled_at, :desc]])
# MONGODB (18ms) db['institutions'].find({"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}).sort([[:portaled_at, :desc]])
我相信索引不是$and
和$or
查詢使用MongoDB的,但即使這樣,如果它很重要,我必須按降序排列上portaled_at
稀疏索引。大約20萬份文檔中只有大約50-60份已經設置了portaled_at。
- 軌3.2.12
- mongoid 2.6.0
- 的MongoDB 2.2.3
這是對我的常識,如果任何人都可以解釋什麼是在我打算將不勝感激。
一個是運行數據庫命令http://docs.mongodb.org/manual/reference/commands/,另一個是查詢。有一個記錄的問題(將在2.4中修復)針對非常緩慢的「count」調用。 https://jira.mongodb.org/browse/SERVER-1752 – WiredPrairie 2013-03-07 02:34:58
感謝您的信息。如果你把它作爲答案發布,我會很樂意接受它。 – rubish 2013-03-07 06:57:25