我正在设计我的数据库,MongoDb思考未来的可扩展性。我现在主要关心的是如何表示索引,正如我所读到的,它在扩展大量集合时,在RAM消耗和分割效率方面是一个关键因素。
为简单起见,我有两个不同的集合。存储用户用户名,电子邮件和一些元数据的用户集合,以及包含设备名称,某些元数据的设备集合,并且应与其所有者相关联。一个用户可以拥有数百万台设备(因此不值得将所有设备存储在单个用户文档中)。
设备集合应该通过(username,device_name)或用户名支持整个设备标识符的查询。
在这种情况下,我看到了一些存储索引的不同方法:
为了测试这个索引,我做了一些服务器负载。我用这些不同的替代品创建了三个不同的集合,并填充了5M文档。一些数据:
524MB
。用户或用户/设备查询时效率很高。352MB
。我仍然可以通过用户高效查询(使用正则表达式/ ^ username @ / explain()报告几乎相同的结果,如1 in),以及确切的用户名/设备。1059MB
!。查询与以前的情况一样顺利。所以,我可以放弃替代3,因为这不是那么有效。在备选方案1和2之间,我更喜欢1,因为这种方法更干净,但它使用了我不会使用的_id字段。所以在这个时刻,获胜的方法似乎是数字2,因为它允许我通过用户名或用户名/设备有效地查询,并且它也需要更少的索引空间。
是否有充分的理由不使用数字2并跟随数字1,就像选择分片键一样?有什么我想念的吗?我是mongoDB的新手,在扩展模式时不希望遇到问题。