【问题标题】: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} 的顺序排序

标签: mongodb indexing compound-index nosql


【解决方案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 字段上的唯一索引是默认创建的,因此您不需要创建它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多