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 indexname
ON tablename(propname[(length)]) INVISIBLE;
3. 通过ALTER TABLE语句创建:
ALTER TABLE tablename
ADD 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”。