MongoDB 索引和投影

Posted

技术标签:

【中文标题】MongoDB 索引和投影【英文标题】:MongoDB Indexing and Projection 【发布时间】:2015-02-01 21:53:59 【问题描述】:

我有几个关于 MongoDB 的问题:

(1) 索引对投影有帮助吗?

(2) 我已经为一个集合分配了一些索引并尝试使用排序运行查找,然后使用explain,它在排序字段上显示BtreeCursor 索引。

可能是其他索引在查询部分有所帮助,而explain 只是没有显示它,因为它只显示了帮助查找的最后一个索引?

或者explain 应该显示所有有助于查询、排序等的索引?

谢谢。

【问题讨论】:

【参考方案1】:

索引有助于投影吗?

我相信它真正有帮助的唯一时间(由性能等定义)是查询是否被“覆盖”:http://docs.mongodb.org/manual/tutorial/create-indexes-to-support-queries/

例如,如果您想查询d:1, e:2 并返回_id, t, e,您可以这样做:

db.t.ensureIndex(d:1 , e:1, _id:1, t:1);
db.t.find(d:1, e:2, _id:1, t:1, e:1);

并且该查询的 explain() 输出将显示 indexOnly 为 true,这意味着它从未从磁盘加载文档以返回响应。

所以是的,在某些情况下,索引可以帮助投影。

我已经为集合分配了许多索引,并尝试使用排序运行查找,然后使用说明,它在排序字段上显示 BtreeCursor 索引。

是的。

可能是其他索引在查询部分有所帮助,并且解释只是没有显示它,因为它只显示了帮助查找的最后一个索引?

如果您是索引交叉的受害者,那么您将使用explain(true) 来显示所有使用的索引计划。

需要注意的是,有交集的查找和排序不使用单独的索引,所以这里的答案其实是否定的:http://docs.mongodb.org/manual/core/index-intersection/#index-intersection-and-sort

【讨论】:

以上是关于MongoDB 索引和投影的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 投影性能 - 还是只是许多小文档?

Grails投影忽略MongoDB的排序顺序

使用 Mongoose 在投影中包含 Mongodb“_id”字段

使用 Mongoose 在投影中包含 Mongodb“_id”字段

通过聚合中的索引投影嵌套数组字段值

使用动态投影在 Mongodb 中进行聚合