vlambda博客
学习文章列表

MySQL 隐藏索引 那点事

从MySQL 8.x开始支持 隐藏索引(invisible indexes) ,只需要将待删除的索引设置为隐藏索引,使 查询优化器不再使用这个索引(即使使用force index(强制使用索引),优化器也不会使用该索引), 确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐藏索 引,再删除索引的方式就是软删除 。


1. 创建表时直接创建 在MySQL中创建隐藏索引通过SQL语句INVISIBLE来实现,其语法形式如下: 

CREATE TABLE tablename( propname1 type1[CONSTRAINT1], propname2 type2[CONSTRAINT2], …… propnamen typen, INDEX [indexname](propname1 [(length)]) INVISIBLE);

上述语句比普通索引多了一个关键字INVISIBLE,用来标记索引为不可见索引。 


2. 在已经存在的表上创建 可以为已经存在的表设置隐藏索引,其语法形式如下: 

CREATE INDEX indexnameON tablename(propname[(length)]) INVISIBLE;


3. 通过ALTER TABLE语句创建:

ALTER TABLE tablenameADD INDEX indexname (propname [(length)]) INVISIBLE;


4、切换索引状态:

ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #切换成隐藏索引ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #切换成非隐藏索引


5、使隐藏索引对查询优化器可见

(1)在MySQL命令行执行如下命令查看查询优化器的开关设置。在输出的结果信息中找到如下属性配置。此属性配置值为off,说明隐藏索引默认对查询优化器不可见。 

select @@optimizer_switch \G

在输出的结果信息中找到如下属性配置

use_invisible_indexes=off

此属性配置值为off,说明隐藏索引默认对查询优化器不可见。

(2)使隐藏索引对查询优化器可见,需要在MySQL命令行执行如下命令:SQL语句执行成功,再次查看查询优化器的开关设置。

set session optimizer_switch="use_invisible_indexes=on";

如果需要使隐藏索引对查询优化器不可见,则只需要执行如下命令即可

set session optimizer_switch="use_invisible_indexes=off";

此时,use_invisible_indexes属性的值已经被设置为“off”。