从 MySQL 迁移架构概览

本页面介绍了如何将 MySQL 架构迁移到 Spanner 架构。我们建议使用 Spanner 迁移工具从现有 MySQL 架构构建 Spanner 架构。该工具会将大多数 MySQL 数据类型映射到 Spanner 类型,并突出显示选项和提供建议,以避免潜在的迁移问题。

数据类型比较

将以下 MySQL 数据类型列表映射到其 Spanner 等效项:

MySQL 数据类型 Spanner 对应项 备注
INTEGERINTBIGINTMEDIUMINTSMALLINTTINYINT INT64
TINYINTBOOLBOOLEAN, BOOLEAN TINYINT(1) 值用于表示布尔值“true”(非零)或“false”(0)。
BIT BOOLEANINT64
CHARVARCHARTINYTEXTTEXTMEDIUMTEXTLONGTEXT STRING Spanner 始终使用 Unicode UTF8 字符串,并且没有可配置的排序规则。
VARCHAR 支持的长度上限为 65535 字节,而 Spanner 最多支持 2621440 个字符。
FLOAT FLOAT32
DOUBLE FLOAT64
DECIMALNUMERIC NUMERIC 在 MySQL 中,NUMERICDECIMAL 数据类型最多支持总共 65 位的精度和标度(如列声明中所定义)。Spanner NUMERIC 数据类型最多支持 38 位的精度和 9 位小数的标度。
如果您需要提升精度,请参阅存储任意精度数值数据以了解替代机制。
BINARYVARBINARYTINYBLOBBLOBMEDIUMBLOBLONGBLOB BYTES 小型对象(小于 10 MiB)可以存储为 BYTES。如需存储较大对象,建议使用替代性 Google Cloud 产品(如 Cloud Storage)。
DATE DATE Spanner 和 MySQL 都采用“yyyy-mm-dd”格式来表示日期,因此不需要进行转换。提供了用于将日期转换为格式化字符串的 SQL 函数。
DATETIMETIMESTAMP TIMESTAMP Spanner 在存储时间时不会考虑时区。如果您需要存储时区,则必须另外使用一个 STRING 列。提供了将时间戳转换为格式化时区字符串的 SQL 函数。
TEXTTINYTEXTENUM STRING 小型 TEXT 值(小于 10 MiB)可以存储为 STRING。如需支持较大的 TEXT 值,建议使用替代性 Google Cloud 产品(如 Cloud Storage)。
ENUM STRING 必须在应用中对 ENUM 值执行验证。
SET ARRAY<STRING> 必须在应用中对 SET 元素值执行验证。
LONGBLOBMEDIUMBLOB BYTESSTRING(包含对象的 URI)。 小型对象(小于 10 MiB)可以存储为 BYTES。 如需存储较大对象,建议使用替代性 Google Cloud 产品(如 Cloud Storage)。
LONGTEXTMEDIUMTEXT STRING(包含数据或外部对象的 URI) 小型对象(少于 2,621,440 个字符)可以存储为 STRING。如需存储较大对象,建议使用替代性 Google Cloud 产品(如 Cloud Storage)。
JSON JSON 小型 JSON 字符串(少于 2,621,440 个字符)可以存储为 JSON。如需存储较大对象,建议使用替代性 Google Cloud 产品(如 Cloud Storage)。
GEOMETRYPOINTLINESTRINGPOLYGONMULTIPOINTMULTIPOLYGONGEOMETRYCOLLECTION STRING, ARRAY Spanner 不支持地理空间数据类型。您必须使用标准数据类型存储此类数据,并在应用中实现所有搜索或过滤逻辑。

在许多情况下,多个 MySQL 类型会映射到单个 Spanner 类型。这是因为 MySQL 针对同一概念有一组长度限制不同的类型,而 Spanner 中有一个总体类型,它具有相对较大的单一限制。

请参考以下示例:

  • MySQL 具有 TEXTTINYTEXTMEDIUMTEXTLONGTEXT。在 Spanner 中,有一个单一类型 STRING,其字符长度参数可以设置为任何值,上限为 2,621,440 个字符。

  • MySQL 具有 INTEGERINTBIGINTMEDIUMINTSMALLINTTINYINT。Spanner 具有单一类型 INT64,用于存储 8 字节有符号整数值。主要区别在于,与 MEDIUMINTSMALLINTTINYINT 相比,Spanner 的 INT64 会消耗更多存储空间。此外,INT64 不会捕获 MEDIUMINTSMALLINTTINYINT 的范围限制,不过可以通过添加 CHECK 限制条件来强制执行这些限制。

Spanner 不支持地理空间类型。您可以通过将这些类型的值编码为字符串、字节或数组来存储它们。任何过滤、操作和函数都必须在应用级执行。

查询

Spanner 采用 ANSI 2011 扩展版 SQL 方言,并提供了许多有助于转换和聚合数据的函数和运算符。对于使用 MySQL 专用的方言、函数和类型的任何 SQL 查询,都需要进行转换才能与 Spanner 兼容。

不支持使用结构化数据作为列定义,但您可以在 SQL 查询中通过 ARRAY<>STRUCT<> 类型来使用结构化数据。例如,您可以使用由 STRUCT 组成的 ARRAY(利用预联接的数据)编写一个返回艺术家的所有专辑的查询。如需了解详情,请参阅文档的子查询部分。

您可以在 Google Cloud 控制台中的 Spanner Studio 页面上运行 SQL 查询。对大型表执行全表扫描时,查询费用通常很高,因此应谨慎使用。如需详细了解如何优化 SQL 查询,请参阅 SQL 最佳实践文档。

存储过程和触发器

Spanner 不支持在数据库级运行用户代码。在架构迁移过程中,请将您在 MySQL 数据库级实现的存储过程和业务逻辑触发器迁移到应用中。

序列

Spanner 建议使用 UUID 版本 4 作为生成主键值的默认方法。GENERATE_UUID() 函数会返回以 STRING 类型表示的 UUID 版本 4 值。

如果您需要生成整数值,Spanner 支持位反转正值序列,这类序列生成的值在正 64 位数字空间中均匀分布。您可以使用这些数字来避免热点问题。

如需了解详情,请参阅主键默认值策略

后续步骤