集合上的复合索引总是比单个索引更好

时间:2013-08-26 16:31:08

标签: mongodb

关于mongdb中的索引,我遇到过这个特定的行。

在执行涉及更改索引条目的插入或更新时,集合上的每个附加索引都会产生一些开销。

这意味着就我的理解而言,如果集合上有更多索引,则会在插入或更新期间降低性能。

因此,复合索引总是比单个索引更好吗?

例如,如果我有一个名为stocks

的集合

并且其上存在复合指数,如下所示

db.stocks.ensureIndex({"symbol":1,"date":1,"type": 1,"price":1},{"unique" : false})

以上情况比下面显示的各个指数要好。

db.stocks.ensureIndex({"symbol" : 1}, {"unique" : false})
db.stocks.ensureIndex({"date" : 1}, {"unique" : false})
db.stocks.ensureIndex({"type" : 1}, {"unique" : false})
db.stocks.ensureIndex({"price" : 1}, {"unique" : false})

如果我不对,请告诉我?

2 个答案:

答案 0 :(得分:1)

我依赖于您的查询,目前MongoDB每个查询只能使用一个索引,并且索引交叉仍然在路线图(https://jira.mongodb.org/browse/SERVER-3071)上,但是可以说复合索引通过前缀工作。作为一个例子,如果你是:

db.c.ensureIndex({s:1,d:1});

该索引适用于sd或仅s但不仅使用d的查询。所以复合指数并不总是最好的方法。

您还必须考虑:

  

在执行涉及更改索引条目的插入或更新时,集合上的每个附加索引都会产生一些开销。

取决于您更新的索引的大小和类型,而不仅仅是您拥有的索引数量。例如,更新包含大文本区域的索引将非常慢。

这也适用于更新大型复合索引,例如两个较小的索引。

答案 1 :(得分:0)

没有。自MongoDB v2.6起支持Index Intersection时,它实际上取决于您查询数据的方式,因为:

  1. 复合索引通常比单个索引大,因此需要更多时间来更新。
  2. 复合索引仅支持所有索引字段或前缀,而单个索引字段支持任何顺序的每个字段子集。
  3. 如果您总是使用所有索引字段进行查询,那么最好使用复合索引,否则我会依赖索引交集及其带来的自由。