MySQL 8.0 新特性之不可见主键

MySQL 8.0 新特性之不可见主键
最新回答
何必太在乎你

2021-10-01 19:12:05

MySQL 8.0 引入的不可见主键(Generated Invisible Primary Key,GIPK)功能,旨在解决无主键表导致的性能与高可用性问题。以下是对该特性的详细解析:

一、核心功能与机制
  1. 自动生成主键当系统变量 sql_generate_invisible_primary_key=ON 时,MySQL 会为未显式定义主键的 InnoDB 表自动添加名为 my_row_id 的不可见主键字段。该字段类型为 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,作为表的隐藏主键。

  2. 不可见性控制

    字段默认标记为 INVISIBLE,不会出现在 SELECT * 或 DESCRIBE 结果中。

    需显式指定字段名(如 SELECT my_row_id)才能查询。

    可通过 ALTER TABLE ... ALTER COLUMN ... SET VISIBLE 临时改为可见。

  3. 系统变量配置

    sql_generate_invisible_primary_key:控制是否启用 GIPK(默认 OFF)。

    show_gipk_in_create_table_and_information_schema:控制是否在 SHOW CREATE TABLE 和 information_schema 中显示不可见主键(默认 ON)。

二、使用限制与注意事项
  1. 修改限制

    不可通过 ALTER TABLE 修改 my_row_id 的数据类型或属性(除可见性外)。

    删除主键需满足条件:表必须保留其他主键或主键字段。

  2. 存储引擎兼容性

    仅支持 InnoDB 引擎。若修改为其他引擎,my_row_id 会变为普通可见主键。

  3. 复制与备份影响

    主从复制:源节点的 GIPK 配置不会自动同步到副本节点。从 MySQL 8.0.32 起,可通过 CHANGE REPLICATION SOURCE TO REQUIRE_TABLE_PRIMARY_KEY_CHECK=GENERATE 强制副本启用 GIPK。

    备份工具:使用 mysqldump 时,--skip-generated-invisible-primary-key 选项可排除 GIPK 信息。

三、实际应用场景
  1. 性能优化无主键表在查询时可能引发全表扫描,GIPK 通过自动添加聚簇索引提升检索效率。

  2. 高可用保障主键是复制和高可用架构(如 Group Replication)的基础要求,GIPK 可避免因遗漏主键导致的配置失败。

  3. 兼容性处理在从旧版本迁移数据时,若原表无主键,GIPK 可确保新表结构符合规范,同时避免应用代码因字段可见性变化产生兼容性问题。

四、示例代码总结-- 启用 GIPK 并创建表SET sql_generate_invisible_primary_key=ON;CREATE TABLE auto_1 (c1 VARCHAR(50), c2 INT);-- 查看表结构(不可见主键默认显示)SHOW CREATE TABLE auto_1;-- 修改主键可见性ALTER TABLE auto_1 ALTER COLUMN my_row_id SET VISIBLE;-- 控制字典信息显示SET show_gipk_in_create_table_and_information_schema=OFF;SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='auto_1';五、潜在问题与建议
  1. 命名冲突若用户显式定义 my_row_id 字段但未设为主键,启用 GIPK 时会报错。建议避免使用该保留字段名。

  2. 复制一致性在异构复制环境中(如跨版本复制),需确保副本节点支持 GIPK 或通过配置强制生成。

  3. 备份恢复若备份时排除 GIPK,恢复后的表将无自动生成的主键,可能影响性能。需根据业务需求权衡。

通过合理利用 GIPK,开发者可在不修改应用逻辑的前提下,提升数据库的健壮性与性能,尤其适合遗留系统或快速原型开发场景。