我模糊地记得,如果一个查询使用了未索引的字段,MongoDB将在其日志中输出一条消息,但是我无法在本地重现这个问题(尽管数据集很小),也没有找到任何相关文档。
我是错觉还是确实有这样的功能?如果是,有人能提供文档链接吗?
您需要开启性能分析,才能从MongoDB中获得有意义的日志 - 将性能分析设置为1即可。
然后,您可以使用任何搜索方式在日志中查找未索引查询,例如:
grep nscanned /path/to/mongodb.log | grep -v "nscanned:1 " | grep -v "nscanned:0 "
我在下面的原始推文中发现了这个信息:https://twitter.com/#!/eonwhite/status/21498320559
你可以在mongo的文档中了解更多关于日志输出意义的内容。
如果nscanned比nreturned高得多,那么数据库正在扫描许多对象以查找目标对象。考虑创建索引来改善此问题。
据我所知,在日志或其他任何地方都没有直接的迹象。间接缺失索引可能会导致这些日志条目:
warning: ClientCursor::yield can't unlock b/c of recursive lock
- 通常发生在 findAndModify
。query db.coll nscanned:656204 reslen:20 5305ms
- 大量扫描文档的慢查询。如果相应的查询足够快,则以上两者都不会出现。