2011-10-09 93 views
2

的MongoDB/Mongoid查询缓慢我有一个mongoid模式是这样的:在索引属性

class Link 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    field :url, type: String 

    index :url, background: true 
end 

现在我有2个查询与分析打开:

Link.where(url: "http://stackoverflow.com/questions/ask").first # =># <Link _id .....> 

执行的< 1ms的,没有缓慢的记录

Link.where(url: "no url").first # =># nil 

执行= 35MS * PROFILER :: * 日10月9日23时36分二十秒[conn20]查询ccc7.links ntoreturn:1 nscanned:16402个reslen:20 35MS

我的问题:

明确索引工作正常,但为什么一个不存在将mongodb这么长时间查询?甚至扫过整个mongo系列?是不是索引照顾这个?

+0

当您在mongo shell上执行查询时,mongodb查询解释会显示什么内容? db.link.find({url:“no url”})。explain() – rit

回答

3

执行的= 35MS PROFILER ::太阳10月9日23点36分二十○秒[conn20]查询ccc7.links ntoreturn:1 nscanned: reslen:20 35MS

很明显,有一个问题。 事实上,如果您仅请求索引字段,则已扫描文档的数量应该接近(等于)结果数量。

documentation

检查项目(文件或索引项)的nscanned数。项目 可能是对象或索引键。如果涉及“覆盖索引”,则扫描的 可能高于nscannedObjects。

正如建议您对请求的解释应该提供更多信息。

你能同时提供的结果:

db.link.getIndexes() 
1

所以,并不完全清楚在这里。所有的网址都是独一无二的“无网址”选项。

如果是这样,并且您按升序对该列编制索引,则会看到字母扫描结果为“n”。由于您的所有网址都以h开头,因此您可能会看到延迟。

不是100%正面,但它是一种可能性。