选择有利于读取性能的MongoDB Shard Key

时间:2013-08-29 02:26:10

标签: mongodb sharding

我在许多地方都读过,选择时间戳是一个很糟糕的选择,因为它会在插入时创建热点。如果我向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'
}

此集合通常以两种方式之一进行查询:

  1. by user_id(按时间戳排序)
  2. by b和timestamp&lt; - 几乎总是被聚合框架操作使用
  3. 如果我希望获得良好/更好的读取性能(对于我的用例来说写入增益是次要的),那么像下列之一的Shard Key是否是一个不错的选择:

    {
      user_id:     1,
      timestamp:   1
    }
    

    {
      user_id:    1,
      _p:         1,
      timestamp:  1
    }
    

    {
      _p:         1,
      timestamp:  1
    }
    

    感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您的数据中的时间戳很少更改,则分片键中的时间戳可能正常 你可以阅读the docs for shard key。好主意 - 用于“确保MongoDB能够在分片之间均匀分布数据”的分片键字段。然后在时间戳上创建索引。如果您的时间戳字段经常更改(插入带有新时间戳的数据),则将其用于分片键是个坏主意,因为mongo无法正常分发您的数据。

答案 1 :(得分:0)

第一次尝试仅由用户进行分片。如果这还不够,请添加_p。当我们谈论分片时,试着想象一个有多个建筑物的图书馆。并想想如何将所有书籍都放在所有的建筑物中。我认为时间戳不是这项工作的最佳解决方案。查找不可变数据(例如,在创建文档时将其设置为一次)和这些字段的分片。