MySQL 隐藏索引

本文讨论了 MySQL 的隐藏索引以及隐藏索引的用法。

MySQL 8 引入了隐藏索引(invisible index)。隐藏索引是实际存在的,但是对 MySQL 查询优化器不可见的索引。即使使用 FORCE INDEX,优化器也不会使用隐藏索引。

在删除一个索引前,您可以先将索引隐藏。如果这不影响性能,您再去真正的删除索引。

隐藏索引对 MySQL 查询优化器是不可见的,但是它是真实存在的,并且对写入操作保持最新。

MySQL 隐形索引用法

MySQL 允许您使用 VISIBLEINVISIBLE 标识索引是否可见。

创建隐藏索引

要创建隐藏索引,请按照如下语法使用 CREATE INDEX 语句:

CREATE INDEX index_name
ON table_name(c1, c2, ...) INVISIBLE;

修改索引的可见性

要更改现有索引的可见性,请按照如下语法使用 ALTER TABLE 语句:

ALTER TABLE table_name
ALTER INDEX index_name [VISIBLE | INVISIBLE];

通过 ALTER TABLE 语句您可以轻松的切换现有索引的可见性。

注意, 您不能将主键列上的索引设置为隐藏索引,否则 MySQL 会给出一个错误。

MySQL 隐藏索引开关

MySQL 查询优化器默认不使用隐藏索引,但是您可以通过系统变量 optimizer_switch 中的 use_invisible_indexes 修改这一行为。

要查看当前的设置,请使用如下语句:

SELECT @@optimizer_switch;

要在当前会话中修改默认的行为,请使用如下语句:

SET SESSION optimizer_switch="use_invisible_indexes=on";

结论

MySQL 隐藏索引是一个真实存在,但是对 MySQL 查询优化器不可见的索引。