Spanner 索引主键字符数有多“深”?例如如果前2个字符相同+1,会不会有超级热点

问题描述

我是第一次使用 Spanner。

我使用 UUIDv4 作为主键,但我正在构建一个表,我认为根据我的理解可以从另一个主键中受益(或者二级索引更好?但我仍在学习如何使用Spanner 中的那些和我的知识较少,尤其是如何在新行或修改行之后构建/维护)。

因为在某些情况下我会通过 WHERE primary_key AND another_primary_phone_number_key 进行选择

例如这个表让我们称之为用户将有 org_id |用户名 | formatted_phone_number,所有电话号码都以 +1 开头,然后到达大多数均匀分布的 1-9 第三个字符串字符

这是该架构的外观 - 示例的缩短

这真的会在我相信 Spanner 称之为 Splits 的情况下均匀分布吗?或者它会成为一个巨大的热点,因为它们都以 + 开头?

CREATE TABLE users (
  org_id STRING(MAX) NOT NULL,user_uuid STRING(MAX) NOT NULL,formatted_phone_number STRING(MAX),fb_uuid STRING(MAX),FOREIGN KEY(org_id) REFERENCES accounts(org_id),) PRIMARY KEY(org_id,user_uuid,formatted_phone_number),INTERLEAVE IN PARENT accounts ON DELETE NO ACTION;

解决方法

这个具体的例子应该(可能)很好,因为重要的部分是避免主键的第一不是单调增加或减少。在您的示例中,第一列是组织键。如果此密钥分布良好,例如因为它是 UUID,则应该没问题。

因此,即使作为主键第三列包含的电话号码单调递增/递减,您仍然会很好,因为它不是键的第一部分。

此外:假设电话号码是主键的第一列,它们都以'+1'开头,后面跟着一些随机字符串,它仍然是一个很好的主键,因为索引是基于在整个字符串上。如果您将所有电话号码按字母顺序写入表格,那只会有问题。