MongoDB - 复合二级索引与串联_id索引

时间:2015-07-05 09:45:41

标签: mongodb

我正在设计我的数据库,MongoDb思考未来的可扩展性。我现在主要关心的是如何表示索引,正如我所读到的,它在扩展大量集合时,在RAM消耗和分割效率方面是一个关键因素。

为简单起见,我有两个不同的集合。存储用户用户名,电子邮件和一些元数据的用户集合,以及包含设备名称,某些元数据的设备集合,并且应与其所有者相关联。一个用户可以拥有数百万台设备(因此不值得将所有设备存储在单个用户文档中)。

设备集合应该通过(username,device_name)或用户名支持整个设备标识符的查询。

在这种情况下,我看到了一些存储索引的不同方法:

  1. 使用带有username和device_name的辅助复合索引(按此顺序)
  2. 使用包含带有username @ device_name
  3. 字符串的和_id的主索引
  4. 在_id字段中使用两个值{owner:username,device:device_name}
  5. 为了测试这个索引,我做了一些服务器负载。我用这些不同的替代品创建了三个不同的集合,并填充了5M文档。一些数据:

    1. 我不使用由mongo创建的自动生成的_id,因为我的所有查询都需要用户名/设备。因此,这种方法需要一些额外的空间来进行索引。索引大小为524MB。用户或用户/设备查询时效率很高。
    2. 当我用自己的字符串替换_id时,索引占用的空间更少。在这种情况下352MB。我仍然可以通过用户高效查询(使用正则表达式/ ^ username @ / explain()报告几乎相同的结果,如1 in),以及确切的用户名/设备。
    3. _id索引无法更改为复合索引,因此需要使用{_id.owner,_id.device}创建辅助复合索引。这导致索引大小为1059MB!。查询与以前的情况一样顺利。
    4. 所以,我可以放弃替代3,因为这不是那么有效。在备选方案1和2之间,我更喜欢1,因为这种方法更干净,但它使用了我不会使用的_id字段。所以在这个时刻,获胜的方法似乎是数字2,因为它允许我通过用户名或用户名/设备有效地查询,并且它也需要更少的索引空间。

      是否有充分的理由不使用数字2并跟随数字1,就像选择分片键一样?有什么我想念的吗?我是mongoDB的新手,在扩展模式时不希望遇到问题。

0 个答案:

没有答案