Google数据存储区 - 在没有热点的情况下索引创建日期的字段

时间:2017-03-31 03:14:37

标签: sorting google-app-engine indexing google-cloud-datastore nosql

我正在使用Google数据存储区,需要查询它以检索某些实体。这些实体需要按最新到最旧排序。我的第一个想法是拥有一个包含时间戳的date_created属性。然后我会将此字段编入索引并对此字段进行排序。这种方法的问题是它会导致数据库中的热点(https://cloud.google.com/datastore/docs/best-practices)。

  

不要使用单调递增值(例如NOW()时间戳)来索引属性。维护此类索引可能会导致热点影响具有高读写速率的应用程序的云数据存储延迟。

显然,对日期排序数据是对数据库执行的最常见排序。如果我无法为时间戳编制索引,是否还有另一种方法可以在没有热点的情况下将我的队列从最新到最旧排序?

1 个答案:

答案 0 :(得分:4)

正如您所注意到的,索引单调更改的值不会缩放,并且可能导致热点。您是否可能受此影响取决于您的特定用途。

作为一般规则,此模式的热点是每秒500次写入。如果你知道你肯定会留在那里,你可能不需要担心。

如果您确实需要每秒高于500次写入,但考虑到上限,则可以尝试使用分片方法。基本上,如果你每秒写入的上限是x,则n = ceiling(x / 500),其中n是分片数。在编写时间戳时,在开头添加随机(1,n)。这将创建n个随机密钥范围,每个密钥范围每秒最多可执行500次写入。查询数据时,您需要发出n个查询并对结果流进行客户端合并。