MySQL 隐藏索引
本文讨论了 MySQL 的隐藏索引以及隐藏索引的用法。
MySQL 8 引入了隐藏索引(invisible index)。隐藏索引是实际存在的,但是对 MySQL 查询优化器不可见的索引。即使使用 FORCE INDEX
,优化器也不会使用隐藏索引。
在删除一个索引前,您可以先将索引隐藏。如果这不影响性能,您再去真正的删除索引。
隐藏索引对 MySQL 查询优化器是不可见的,但是它是真实存在的,并且对写入操作保持最新。
MySQL 隐形索引用法
MySQL 允许您使用 VISIBLE
和 INVISIBLE
标识索引是否可见。
创建隐藏索引
要创建隐藏索引,请按照如下语法使用 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 查询优化器不可见的索引。