MySQL 8.0 新特性:invisible indexes
一、前言
什么是 invisible indexes 呢?就是不可见索引,优化器会默认忽略的索引,关于这个特性的用处,需要我们一起挖掘。
二、案例思考
某客户研发提了一条删除索引的 SQL,这张表 15G,经确认后说索引已不再使用,随后执行删除索引 SQL,结果不一会数据库 CPU 就开始飙升,活跃会话出现堆积,发现依然有 SQL 需要依赖刚才使用的索引。
现在删除了,只能走全表扫描了。马上又加回去,又有很多会话堆积,还有 MDL 锁,表还非常大,只能临时先停掉相关业务,重新加上索引后恢复。
如果有 8.0 这个特性,那我们删除一个索引,就安全多了,只需要修改属性即可。
-- 修改索引属性,不可见
alter table dwd_total_value_vendor_day alter index index_mult_dim_day invisible;
三、总结
我们再次对比一下 5.7 和 8.0 的索引属性,下方是 5.7
*************************** 3. row *************************** Table: new Non_unique: 1 Key_name: idx_new_title Seq_in_index: 1 Column_name: new_title Collation: A Cardinality: 2476 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment:
下方是 8.0 版本:
*************************** 3. row *************************** Table: new Non_unique: 1 Key_name: idx_new_title Seq_in_index: 1 Column_name: new_title Collation: D Cardinality: 2291 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: Visible: YES Expression: NULL
目前来看 8.0 为索引添加了一些小特性,使 MySQL 8.0 的索引功能更加完整和精致 🎁
关于 invisible indexes 更像是索引的开关,某些情况下还是很有用的。
下面是关于不可见索引常用 SQL 语句模版
-- 查询元数据,哪些索引不可见 select table_schema, table_name, index_name, column_name, is_visible from information_schema.statistics where is_visible = 'no';
-- 修改索引可见 alter table xx alter index idx_xx visible; -- 修改索引不可见 alter table xx alter index idx_xx invisible; -- 创建一个不可见索引 alter table xx add index idx_xx(column_name) invisible;