MySQL 8 引入索引 VISIBLE 与 INVISIBLE 的实战意义

更新日期: 2018-08-07 阅读次数: 25510 分类: MySQL

实际使用场景:

线上服务的数据库中某个字段已经创建了索引,但是后续运营过程中,发现这个索引并没有实际用途,反而影响了写入速度。那么,我们就会想去掉这个字段的索引。可是,在数据量非常大的情况下,新建索引,删除索引都是一件非常耗时的操作。所以,删除索引的操作,马虎不得。一旦发现这个索引还有其他业务用到,再重新建索引,耗时的创建过程会严重影响线上业务。

这时,index 的 visible 和 invisible 就非常实用了。可以先将该索引设置为 invisible,这样优化器就会忽略这个索引,但是索引依然存在于引擎内部。而设置 invisible 和 visible 操作的耗时又非常少,对业务基本没有任何影响。这样,观察一段时间后,如果业务一切正常,就可以删除索引了。

注意,索引 VISIBLE 与 INVISIBLE 在 MySQL 8 之后才支持

我开发环境用了 MySQL 8, 默认生成的建表语句中使用了默认的 VISIBLE index

例如:

CREATE TABLE `keywords` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin' NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `ux_name` (`name` ASC) VISIBLE);

但是如果把这个建表语句发到线上服务器的 MySQL 5.7 上执行,则会报错

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VISIBLE)' at line 5

所以,既然 index 默认为 visible,那建表语句中不写 visible 为好。

参考

http://mysql.taobao.org/monthly/2017/07/03/

tags: MySQL 8

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

谈笑风生

e燃物

特意在博客里面没有加搜索吗?

大象

有搜索,用的 Google 自定义搜索,但是你需要先科学上网。

e燃物

看到了,上次没有看到,是不是背景太炫,,我没发现,这次看到了,科学上网,啥意思

大象

Google 一下,你就知道

e燃物

我发现问题了,但不确定,就是我在 不同的ip宽带下面,看到不同,就是一个ip就可以看到右侧的谷歌搜索,另一个ip下看到的就没有;都是谷歌浏览器,是不是广告冲突或者,就是被屏蔽掉了?

大象

就是被屏蔽了。