2

我在很多地方都读到,选择时间戳是一个糟糕的选择,因为它在插入时会创建热点。如果我向 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. 按 user_id(按时间戳排序)
  2. by b 和 timestamp <- 几乎总是被聚合框架操作使用

如果我希望获得良好/更好的读取性能(写入增益对于我的用例而言是次要的),那么像以下之一的 Shard Key 是否是一个不错的选择:

{
  user_id:     1,
  timestamp:   1
}

或者

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

或者

{
  _p:         1,
  timestamp:  1
}

谢谢你的帮助。

4

2 回答 2

0

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

于 2013-08-29T08:46:29.980 回答
0

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

于 2013-08-29T08:36:21.987 回答