MongoDB警告查询不使用索引
Posted
技术标签:
【中文标题】MongoDB警告查询不使用索引【英文标题】:MongoDB warn about query not using index 【发布时间】:2012-02-08 10:35:01 【问题描述】:我有一个模糊的记忆,如果查询使用未编入索引的字段,MongoDB 将向其日志输出一条消息,但是我无法在本地重现此内容(使用公认的小数据集),也没有找到任何文档.
我是在想象,还是有这样的功能?如果是,任何人都可以链接到文档吗?
【问题讨论】:
【参考方案1】:您需要打开 profiling 才能从 mongodb 获取有意义的日志 - 将 profiling 设置为 1 就足够了。
然后,您可以在日志中使用任意数量的搜索来查找未编入索引的查询,例如:
grep nscanned /path/to/mongodb.log | grep -v "nscanned:1 " | grep -v "nscanned:0 "
我发现这件事的原始推文:https://twitter.com/#!/eonwhite/status/21498320559
您可以查看更多关于日志输出的含义in mongo's docs
如果 nscanned 远高于 nreturned,则数据库正在扫描许多对象以查找目标对象。考虑创建一个索引来改善这一点。
【讨论】:
除此之外,请查看mongodb.org/display/DOCS/… - 它解释了您可以在分析器中查看的各种数据。 --slowms 选项可用于降低查询也被视为慢的阈值,以便您查看更多不使用索引的操作。【参考方案2】:您可能会想到notablescan
parameter 和configuration option。但是,它不是警告或日志记录功能。相反,每当进行没有有用索引的查询时,它会导致服务器抛出错误(强制服务器扫描整个集合)。
【讨论】:
【参考方案3】:也许您指的是“解释”功能?
查看此链接:http://www.mongodb.org/display/DOCS/Explain
基本上,您可以告诉 Mongo 在您运行查询时为您提供额外数据,这些数据包括有关是否使用索引的详细信息。
【讨论】:
【参考方案4】:AFAIK 在日志或其他任何地方都没有直接的迹象。间接缺少索引可能会导致以下日志条目:
warning: ClientCursor::yield can't unlock b/c of recursive lock
- 通常与 findAndModify
发生。
query db.coll nscanned:656204 reslen:20 5305ms
- 扫描文档数量多时查询速度慢。
如果相应的查询执行得足够快,以上都不会显示。
【讨论】:
"5305ms" 对我来说似乎是一个非常直接的缓慢/未索引查询的标志 =)以上是关于MongoDB警告查询不使用索引的主要内容,如果未能解决你的问题,请参考以下文章