我在很多地方都读到,选择时间戳是一个糟糕的选择,因为它在插入时会创建热点。如果我向 Shard Key 添加另一个或两个属性,它将创建更均匀的分布,但唯一可能有意义的其他属性不是用于查询的属性。这对于最大限度地利用读取性能有多重要?
样本文件
{
_id: <ObjectId>,
user_id: <ObjectId>,
_p: <6-10 possible values>,
ts: <UNIX timestamp>,
a: 'lorem ipsum',
b: <Array of ObjectId, can be null/empty>,
...,
z: 'xyz'
}
此集合通常通过以下两种方式之一进行查询:
- 按 user_id(按时间戳排序)
- by b 和 timestamp <- 几乎总是被聚合框架操作使用
如果我希望获得良好/更好的读取性能(写入增益对于我的用例而言是次要的),那么像以下之一的 Shard Key 是否是一个不错的选择:
{
user_id: 1,
timestamp: 1
}
或者
{
user_id: 1,
_p: 1,
timestamp: 1
}
或者
{
_p: 1,
timestamp: 1
}
谢谢你的帮助。