【发布时间】:2013-09-01 07:41:53
【问题描述】:
我在很多地方都读到过,选择时间戳对于 Shard Key 来说是一个糟糕的选择,因为它会在插入时创建热点。如果我向 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(按时间戳排序)
- 由 b 和时间戳
如果我希望获得良好/更好的读取性能(写入增益对于我的用例而言是次要的),那么像以下之一的 Shard Key 是否是一个不错的选择:
{
user_id: 1,
timestamp: 1
}
或
{
user_id: 1,
_p: 1,
timestamp: 1
}
或
{
_p: 1,
timestamp: 1
}
感谢您的帮助。
【问题讨论】: