我必须为MongoDb集合创建索引:
用户
1. 30%的查询是 {_ id,token,device_id}
2.其他常见问题(30%)是 {_ id,token}
3.其余(40%)是单独使用的查询: 的 {_ ID} 的 {DEVICE_ID} 的 {用户ID} 的 {facebook_id}
我不知道如何管理它。 我几乎可以肯定我需要在 {_ id:“1”,令牌:“1”,device_id:“1”} 上创建复合索引。 我的问题是:
a)复合指数是否会优化第一种和第二种情况,对吗?
b)我应该如何处理案例3?为每个字段创建索引?
谢谢!
答案 0 :(得分: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在评论中所说。最后一种情况可能需要device_id
,userid
和facebook_id
字段上的3个单独索引(默认情况下会创建_id
字段上的唯一索引,因此您不必需要创建它。)