我有一个单调增加字段的表,我想将其放入索引中。但是,最佳实践guide表示不将单调增加的数据放入非交错索引中。当我尝试将数据放入交错索引时,我无法在其父表中交错索引。
换句话说,我希望Cloud Spanner等效于这个MySQL架构。
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')
)
答案 0 :(得分:3)
这实际上取决于您将编写单调增加/减少值的速率。
我不知道Spanner服务器在您热点之前可以处理的每秒写入的确切范围(并且它取决于您的数据),但是如果您正在编写<每秒500行你应该可以使用这种模式。如果您的写入负载高于单个Spanner服务器本身可以轻松处理,那么这只是一个问题。
如果您的写入率较大或相对无限制(例如,随着系统/网站的普及而扩展),那么您需要寻找替代方案。这些替代方案实际上取决于您的确切用例,以确定您愿意采取哪些权衡。
一种通用方法是手动分片索引。比方说,您知道您的峰值写入负载将是每秒1740次插入。如果我们可以使用4个Spanner服务器(每个435写入/秒)对这个负载进行分片,那么我们可以使用之前每个服务器编号大约500次写入来避免热点。
在Cloud Spanner中使用INT64类型允许的最大值为9,223,372,036,854,775,808。分片的一个示例方法是向每个值添加random(0,3)*1,000,000,000,000,000,000
。这会将索引键范围拆分为4个范围,可由4个Spanner服务器提供。在屏蔽x,000,000,000,000,000,000
之后,您需要执行4次查询并在客户端合并结果。
注意:交错是指来自一个表的数据/索引与来自另一个表的日期交织的时间。您不能只与一个表交错。