MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实
MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者
"不可见索引"。
隐藏索引是什么鬼?
隐藏索引 字面意思就是把索引进行隐藏,即不可见,它不是用来查询优化的,
所以它不会被优化器使用到。隐藏索引适用于除主键索引(显示或者隐式设
置)之外的索引,意味着主键索引是不能通过任何方式隐藏的。
MySQL 数据库默认创建的索引都是可见的,要显式控制一个索引的可见性,可
以在 CREATE TABLE,CREATE INDEX 或 ALTER TABLE 的索引定义命令中使用
VISIBLE 或 INVISIBLE 关键字。
如下面示例所示:
CREATE TABLE javastack (
age INT,
weight INT,
tall INT,
INDEX age_idx (age) INVISIBLE
) ENGINE = InnoDB;
CREATE INDEX weight_idx ON javastack (weight) INVISIBLE;
ALTER TABLE javastack ADD INDEX tall_idx (tall) INVISIBLE;
要变更现有索引的可见性,可以在 ALTER TABLE ... ALTER INDEX 命令中使用
VISIBLE 或 INVISIBLE 关键字。
年龄索引变更为不可见(隐藏):
ALTER TABLE javastack ALTER INDEX age_idx INVISIBLE;
年龄索引变更为可见:
ALTER TABLE javastack ALTER INDEX age_idx VISIBLE;
怎么知道一个表中的索引是可见还是不可见,可以从
INFORMATION_SCHEMA.STATISTICS 表,或者 SHOW INDEX 命令输出中获得。例
如:
mysql> SELECT
INDEX_NAME,
IS_VISIBLE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'javastack';