问题描述
我是第一次使用 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'
开头,后面跟着一些随机字符串,它仍然是一个很好的主键,因为索引是基于在整个字符串上。如果您将所有电话号码按字母顺序写入表格,那只会有问题。