我在许多地方都读过,选择时间戳是一个很糟糕的选择,因为它会在插入时创建热点。如果我向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'
}
此集合通常以两种方式之一进行查询:
如果我希望获得良好/更好的读取性能(对于我的用例来说写入增益是次要的),那么像下列之一的Shard Key是否是一个不错的选择:
{
user_id: 1,
timestamp: 1
}
或
{
user_id: 1,
_p: 1,
timestamp: 1
}
或
{
_p: 1,
timestamp: 1
}
感谢您的帮助。
答案 0 :(得分:0)
如果您的数据中的时间戳很少更改,则分片键中的时间戳可能正常 你可以阅读the docs for shard key。好主意 - 用于“确保MongoDB能够在分片之间均匀分布数据”的分片键字段。然后在时间戳上创建索引。如果您的时间戳字段经常更改(插入带有新时间戳的数据),则将其用于分片键是个坏主意,因为mongo无法正常分发您的数据。
答案 1 :(得分:0)
第一次尝试仅由用户进行分片。如果这还不够,请添加_p。当我们谈论分片时,试着想象一个有多个建筑物的图书馆。并想想如何将所有书籍都放在所有的建筑物中。我认为时间戳不是这项工作的最佳解决方案。查找不可变数据(例如,在创建文档时将其设置为一次)和这些字段的分片。