2021-10-01 19:12:05
MySQL 8.0 引入的不可见主键(Generated Invisible Primary Key,GIPK)功能,旨在解决无主键表导致的性能与高可用性问题。以下是对该特性的详细解析:
一、核心功能与机制自动生成主键当系统变量 sql_generate_invisible_primary_key=ON 时,MySQL 会为未显式定义主键的 InnoDB 表自动添加名为 my_row_id 的不可见主键字段。该字段类型为 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,作为表的隐藏主键。
不可见性控制
字段默认标记为 INVISIBLE,不会出现在 SELECT * 或 DESCRIBE 结果中。
需显式指定字段名(如 SELECT my_row_id)才能查询。
可通过 ALTER TABLE ... ALTER COLUMN ... SET VISIBLE 临时改为可见。
系统变量配置
sql_generate_invisible_primary_key:控制是否启用 GIPK(默认 OFF)。
show_gipk_in_create_table_and_information_schema:控制是否在 SHOW CREATE TABLE 和 information_schema 中显示不可见主键(默认 ON)。
修改限制
不可通过 ALTER TABLE 修改 my_row_id 的数据类型或属性(除可见性外)。
删除主键需满足条件:表必须保留其他主键或主键字段。
存储引擎兼容性
仅支持 InnoDB 引擎。若修改为其他引擎,my_row_id 会变为普通可见主键。
复制与备份影响
主从复制:源节点的 GIPK 配置不会自动同步到副本节点。从 MySQL 8.0.32 起,可通过 CHANGE REPLICATION SOURCE TO REQUIRE_TABLE_PRIMARY_KEY_CHECK=GENERATE 强制副本启用 GIPK。
备份工具:使用 mysqldump 时,--skip-generated-invisible-primary-key 选项可排除 GIPK 信息。
性能优化无主键表在查询时可能引发全表扫描,GIPK 通过自动添加聚簇索引提升检索效率。
高可用保障主键是复制和高可用架构(如 Group Replication)的基础要求,GIPK 可避免因遗漏主键导致的配置失败。
兼容性处理在从旧版本迁移数据时,若原表无主键,GIPK 可确保新表结构符合规范,同时避免应用代码因字段可见性变化产生兼容性问题。
命名冲突若用户显式定义 my_row_id 字段但未设为主键,启用 GIPK 时会报错。建议避免使用该保留字段名。
复制一致性在异构复制环境中(如跨版本复制),需确保副本节点支持 GIPK 或通过配置强制生成。
备份恢复若备份时排除 GIPK,恢复后的表将无自动生成的主键,可能影响性能。需根据业务需求权衡。
通过合理利用 GIPK,开发者可在不修改应用逻辑的前提下,提升数据库的健壮性与性能,尤其适合遗留系统或快速原型开发场景。