如何索引 table 中单调递增的数据?

How to index monotonically increasing data in a table?

我有一个 table,它有一个单调递增的字段,我想将它放入索引中。但是,最佳实践 guide 表示不要将单调递增的数据放入非交错索引中。当我尝试将数据放入交错索引时,我无法在其父项 table.

中交错索引

换句话说,我想要这个 MySQL 架构的 Cloud Spanner 等价物。

CREATE TABLE `my_table` (
  'id' bigint(20) unsigned NOT NULL,
  'monotonically_increasing' int(10) unsigned DEFAULT '0',
  PRIMARY KEY ('id'),
  KEY 'index_name' ('monotonically_increasing')
)

这实际上取决于您单调写入 increasing/decreasing 值的速率。

写入负载小

我不知道 Spanner 服务器在热点之前可以处理的每秒写入的确切范围(这取决于您的数据),但是如果您每秒写入 < 500 行,您应该没问题有了这个图案。如果您的写入负载高于单个 Spanner 服务器可以轻松处理的负载,这只是一个问题。

大写入负载

如果您的写入速率更高,或者相对不受限制(例如,随着您的 systems/sites 受欢迎程度而增加),那么您需要寻找替代方案。这些备选方案实际上取决于您的确切用例来确定您愿意做出哪些权衡。

一种通用方法是手动对索引进行分片。比方说,您知道您的峰值写入负载将是每秒 1740 次插入。使用之前每个服务器大约 500 次写入,如果我们可以将此负载分片到 4 个 Spanner 服务器(每个 435 writes/second),我们将能够避免热点。

在 Cloud Spanner 中使用 INT64 类型允许的最大值为 9,223,372,036,854,775,808。分片的一种示例方法是我们通过将 random(0,3)*1,000,000,000,000,000,000 添加到每个值。这会将索引键范围拆分为 4 个范围,可由 4 个 Spanner 服务器提供服务。缺点是您需要执行 4 次查询并在屏蔽掉 x,000,000,000,000,000,000.

后在客户端合并结果

注意:交错是指来自一个 table 的 data/indexes 与另一个 table 的日期交错。你不能只插入一个 table.