我的文档结构是:
"_id": ObjectId("50c41fae0e708237dc7a5187"),
"uid": "999",
"appname": "authentication",
"activityId": "login",
"activityName": "login",
"date": ISODate("2012-12-09T05: 20: 46.117Z"),
"yearmonth": "201212"
uid 是其他应用程序从 RDMS 序列生成的用户 ID。yearmonth 是我在应用程序中创建的人工字段,仅用于更好的分片键。
写入模式:当用户登录或在站点上执行特定操作时,我将事件写入 mongoDB。这意味着 uid 是相对随机的,具有非常高的基数。对于同一个 uid,我可以编写数百个事件。
读取模式:大多数查询都基于 uid 作为第一个查询参数。{uid:"9999",date:{$gt: ....}, activityId:'login'}
我最初的分片键是 {uid:1, date:1}。- 如果任何一个 uid 有太多文档,则提供良好的查询隔离并具有可拆分的块。现在,基于如何选择分片键:纸牌游戏文章和一些网络研讨会和论坛上的评论,我意识到更好的密钥应该是 {coarse timestamp:1 , search criteria:1} 。想法是为分片键提供更好的局部性以帮助提高写入性能。所以我创建了 yearmonth 字段并考虑将我的分片键更改为 {yearmonth:1, uid:1}
问题是:我是否因为更改而松散了查询隔离和读取操作的性能?我的查询参数将不再匹配分片键的第一个元素。