关于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})
如果我不对,请告诉我?
答案 0 :(得分:1)
我依赖于您的查询,目前MongoDB每个查询只能使用一个索引,并且索引交叉仍然在路线图(https://jira.mongodb.org/browse/SERVER-3071)上,但是可以说复合索引通过前缀工作。作为一个例子,如果你是:
db.c.ensureIndex({s:1,d:1});
该索引适用于s
和d
或仅s
但不仅使用d
的查询。所以复合指数并不总是最好的方法。
您还必须考虑:
在执行涉及更改索引条目的插入或更新时,集合上的每个附加索引都会产生一些开销。
取决于您更新的索引的大小和类型,而不仅仅是您拥有的索引数量。例如,更新包含大文本区域的索引将非常慢。
这也适用于更新大型复合索引,例如两个较小的索引。
答案 1 :(得分:0)
没有。自MongoDB v2.6
起支持Index Intersection时,它实际上取决于您查询数据的方式,因为:
如果您总是使用所有索引字段进行查询,那么最好使用复合索引,否则我会依赖索引交集及其带来的自由。