MySQL 8.0 中的隐藏特性

隐藏有关的特性

隐藏列

8.0.23 新增隐藏列特性。什么是隐藏列?它基本上是一个表的常规列,具有自己的名称和数据类型。它像任何其他常规列一样处理和更新,唯一的区别是对应用程序不可见。换句话说,只有在 SELECT 语句中明确搜索它时,才能访问它;否则,它就像一个不存在的列。

使用 INVISIBLE 关键字创建隐藏列

1
ALTER TABLE articles ADD COLUMN title VARCHAR(200) INVISIBLE AFTER ts;

隐藏列需要指定字段查询

1
SELECT title FROM articles

使用 VISIBLE 将隐藏列设置为可见

1
ALTER TABLE articles MODIFY COLUMN title varchar(200) VISIBLE;

隐形性的元数据在 information_schema 中可用,INVISIBLE/VISIBLE 关键字在 binlog 中保留,以便正确复制所有更改。

生成的隐藏主键

这个特性在 MySQL 8.0.30 开始提供。生成的隐藏主键(GIPK)是一种特殊的隐藏列,仅适用于 InnoDB 表。如果不显示创建主键,InnoDB 会创建一个隐藏的主键,但是 GIPK 提供的新特性使主键可以变得可用和最后可见。

默认情况下,此功能被禁用,因此 MySQL 将继续像过去一样运行。要启用 GIPK,您必须设置以下动态系统变量(它具有全局和会话作用域):

1
SET [PERSIST] sql_generate_invisible_primary_key=ON;

隐藏索引

MySQL 8.0 的第一个版本中引入,可以使索引对优化器不可见,以便测试如果该索引不存在,查询的性能会如何。不过,当索引不可见时,在针对表执行任何 DML 语句(INSERT、UPDATE、DELETE、REPLACE)时,它仍会得到更新。

可以使用以下语句将索引设置为不可见和再次可见:

1
2
ALTER TABLE mytable ALTER INDEX my_idx INVISIBLE;
ALTER TABLE mytable ALTER INDEX my_idx VISIBLE;