何时对 mongodb 中的多个键进行索引

Posted

技术标签:

【中文标题】何时对 mongodb 中的多个键进行索引【英文标题】:when to index on multiple keys in mongodb 【发布时间】:2011-03-02 07:19:44 【问题描述】:

假设我有一个带有 :price 和 :qty 字段的 Item 文档。有时我想查找与给定 :price AND :qty 匹配的所有文档,而在其他时候,它会单独为 :price 或单独为 :qty。

我已经为 :price 和 :qty 键编制了索引,但我是否还需要同时为这两个键创建复合索引,或者单键索引是否足够?

编辑:我发现 mongodb 网站上的这篇文章非常有用:

http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ

【问题讨论】:

是的,我很想知道其他人的想法。我有一个可以搜索多个“字段”的集合。显然 _id 已编入索引,但我还有一些其他的。 【参考方案1】:

如果您需要 :price 本身或 :qty 本身,则复合索引将不起作用。

【讨论】:

我现在只有一个索引,我想知道我是否还需要一个复合索引来用于在 :price 和 :qty 上运行的查询 这不是真的。复合索引 :price+:qty 将有助于 :price 本身,因为 :price 在复合索引中是第一位的。【参考方案2】:

price 上的索引有助于查询 priceqty 上的索引有助于查询 qtypriceqty 上的索引有助于对 price 的查询以及对 priceqty 的查询。因此,这就像以一个价格获得两个指数。不过,这对qty 的查询没有帮助。

您应该尽量减少您拥有的索引数量,因此删除一个单键索引并从该键开始创建一个复合索引。

作为一般规则,如果您对xyz 进行查询,则应该有一个类似x:1, y:1, z:1 的索引。该索引将使以下查询快速:

db.foo.find(x : ..., y : ..., z : ...)
db.foo.find(x : ..., y : ...)
db.foo.find(x : ...)

它不会使这些查询变得很快:

db.foo.find(y : ..., z : ...)
db.foo.find(y : ...)

因此,请确保您的查询中包含索引的起始键。

【讨论】:

自 1.6+ 以来已更改,现在 Mongo 可以使用复合索引中的任何键:mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes 确实,我忘了补充。 对于db.foo.find(x : ..., z : ...) 的查询怎么样,当查询中缺少中间索引键时,它会加快查询速度吗?

以上是关于何时对 mongodb 中的多个键进行索引的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 遇见 spark(进行整合)

MongoDB 遇见 spark(进行整合)

MongoDB - 对时间序列子文档进行范围查询

MongoDB复合索引详解

为啥以及何时需要在 MongoDB 中重建索引?

是否可以在 pandas 数据框中有多个索引?