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_id1. 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);
当您在这些字段上具有复合索引时,您还可以在单个字段上创建索引(例如,在 token
或 device_id
等字段上)。
正如 Sammaye 在 cmets 中所建议的那样。最后一种情况可能需要device_id
、userid
和facebook_id
字段上的3 个单独索引(_id
字段上的唯一索引是默认创建的,因此您不需要创建它)。
【讨论】:
以上是关于MongoDB索引,是不是可以同时创建普通和复合?的主要内容,如果未能解决你的问题,请参考以下文章