主键迁移概览

本页面介绍 Spanner 如何与主键和优惠协同工作 主键迁移策略:

主键的典型方法是使用代理键,例如自动递增键 数字。此类主键可让您灵活地在当前和未来优化您的键, 也无需担心业务逻辑发生变化在单实例数据库中 因为在音量较低时,按顺序键的效果会比较好但在分布式系统中 顺序键不能很好地进行扩展。

Spanner 中的顺序主键

在 Spanner 中,每个表都有一个主键,主键包含一个或多个 表格中的列。表的主键可唯一标识每一行 表格。Spanner 使用主键来分布行组, 称为“分片”,即跨 Spanner 实例中的计算节点。这是 称为“范围分片”,这让 Spanner 能够并行处理查询, 。

如果行中的主键值相近, 例如单调自动递增键,它们往往会进入同一个分屏。这可能会造成热点,其中分块可以使用所有可用的计算和内存资源。热点可能会导致延迟时间增加 可能会导致超时和事务被中止

为了充分利用 Spanner 的可扩缩性并避免出现热点,Spanner 提供了内置解决方案作为自动递增主键的替代方案。

主键建议

Spanner 中主键的默认建议是使用 通用唯一标识符版本 4 (UUIDv4) 值。UUID 是 128 位标识符 使用 122 位随机数据UUIDv4 值的范围非常广泛,无论在何处生成,都具有唯一性。这使得它们 Spanner 中的非热点主键的理想候选对象。

您可能需要使用整数主键,因为它们占用的空间更小,并且可以降低您必须进行的应用更改的复杂性。您可以使用正位反转序列来生成在正 64 位整数空间中均匀分布的唯一主键值。

如需详细了解如何选择 主键可防止出现热点问题,请参阅架构设计最佳实践

迁移策略

根据应用的使用场景和需求,您可以部署主键 迁移策略以下每种迁移策略都具有以下特点:

  • 请确保所迁移主键的保真度和正确性。
  • 尽量减少下游应用更改,例如更改类型或主键值。
  • 实施 Spanner 最佳实践来提高性能和可伸缩性。
  • Spanner 只会更改新数据的生成方法,不会影响现有数据。

迁移 UUID 密钥数据库

考虑您要从使用 使用 UUID 主键导入 Spanner。 将现有 UUID 键配置为源数据库中的字符串,并将其导入 复制到 Spanner。UUID 值,特别是 v4 实际上是唯一的,无论它们是在何处生成的。

您可以使用 GENERATE_UUID() 函数(GoogleSQLPostgreSQL) 迁移 UUID 键数据库。

如需有关迁移 UUID 密钥数据库的说明, 请参阅迁移 UUID 键列

迁移具有顺序键的单实例数据库

假设您要从使用顺序单调键的单实例数据库进行迁移, 例如 MySQL 中的 AUTO_INCREMENT SERIAL 或者标准 在 SQL Server 或 Oracle 中使用 IDENTITY 类型。

配置 Spanner SEQUENCE 对象以跳过 现有密钥并生成新的位反转密钥。已生成位反转密钥 始终大于零,SEQUENCE 并在 64 位正整数空间中均匀分布。

如需了解有关迁移具有顺序键的数据库的说明, 请参阅迁移 自动生成顺序主键

迁移支持实时割接的序列密钥数据库

考虑您要从使用顺序单调键的单个实例数据库进行迁移 并支持复制场景,例如 您需要在数据库系统之间进行实时割接。

配置 Spanner SEQUENCE 对象以跳过整个值范围 源数据库中现有密钥的组合,并生成新的位倒序密钥 。Spanner 生成的位反转密钥 SEQUENCE 对象始终大于零,但不进行排序。

如需有关迁移支持实时割接的数据库的说明, 请参阅 使用 Spanner 和您的源数据库

迁移具有应用逻辑依赖项的序列关键数据库

假设您要从使用顺序单调键的数据库进行迁移,并且您的应用逻辑依赖于主键顺序来确定新近性或对新创建的数据进行排序。

创建用于组合均匀分布值的复合键,例如 分片 ID 或哈希值,作为第一个组成部分,序列号作为 第二个组件。这样可以保留有序键值,而不会造成大规模热点。

有关使用应用逻辑迁移顺序键数据库的说明 依赖项 请参阅迁移您自己的主键

后续步骤

  • 如需查看详细的迁移工作流,请参阅迁移主键