MongoDB索引,是不是可以同时创建普通和复合?

Posted

技术标签:

【中文标题】MongoDB索引,是不是可以同时创建普通和复合?【英文标题】:MongoDB Indexes, is it possible to create both normal & compound at the same time?MongoDB索引,是否可以同时创建普通和复合? 【发布时间】:2014-08-14 13:31:23 【问题描述】:

我必须为 MongoDb 集合创建索引:

用户

_id app_version 国家代码 facebook_id 令牌 用户名 device_id

1. 30% 的查询是 _id, token,device_id

2.其他常见查询 (30%) 是 _id, 令牌

3.其余 (40%) 是单独使用的查询: _id device_id 用户名 facebook_id

我不知道如何管理它。 我几乎可以肯定我需要在 _id:"1" , token:"1",device_id:"1" 上创建一个复合索引。 我的问题是:

a)复合索引会优化第一种和第二种情况吗?

b)案例3我该怎么办?为每个字段创建索引?

谢谢!

【问题讨论】:

查询是否包含所有字段?例如,一个涉及所有 _id, token,device_id 的查询? 不,我有不同的查询:_id, token,device_id, _id,token _id,userid,device_id,facebook_id。这些都是查询@奈姆琼 是的,由于 MongoDB 中复合索引的树状机制,您可以将场景三作为 4 个单独的索引来执行。虽然 _id 已经被索引了 @Sammaye 问题 a 的答案是什么? 那里的答案是肯定的,前提是您只通过_id, token, device_id_id, token 进行查询,并且索引按_id, token, device_id 的顺序排序 【参考方案1】:

是的,可以在字段上创建复合索引并分别索引这些字段。

如果你创建这样的复合索引:

db.coll.ensureIndex(_id : 1, token : 1,device_id: 1); 

该索引将支持对索引字段前缀的查询: 复合索引将支持以下查询:

db.coll.find( _id : ObjectId(....), token : "foo");
db.coll.find( _id : ObjectId(....), token : "foo", device_id: 12345);

当您在这些字段上具有复合索引时,您还可以在单​​个字段上创建索引(例如,在 tokendevice_id 等字段上)。

正如 Sammaye 在 cmets 中所建议的那样。最后一种情况可能需要device_iduseridfacebook_id 字段上的3 个单独索引(_id 字段上的唯一索引是默认创建的,因此您不需要创建它)。

【讨论】:

以上是关于MongoDB索引,是不是可以同时创建普通和复合?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 索引唯一性约束

MongoDB 中的复合索引是不是改进了多重匹配(而不是排序)?

MongoDB复合索引详解

复合索引的顺序在 MongoDB 性能方面有何影响?

MongoDB通过许多参数过滤(复合索引与否)

深入理解MongoDB的复合索引