MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 "不可见索引"。

隐藏索引是什么鬼?

隐藏索引 字面意思就是把索引进行隐藏,即不可见,它不是用来查询优化的,所以它不会被优化器使用到。隐藏索引适用于除主键索引(显示或者隐式设置)之外的索引,意味着主键索引是不能通过任何方式隐藏的。

MySQL 数据库默认创建的索引都是可见的,要显式控制一个索引的可见性,可以在 CREATE TABLE,CREATE INDEX 或 ALTER TABLE 的索引定义命令中使用 VISIBLE 或 INVISIBLE 关键字。

如下面示例所示:

CREATE TABLE javastack ( age INT, weight INT, tall INT, INDEX age_idx (age) INVISIBLE) ENGINE = InnoDB;CREATE INDEX weight_idx ON javastack (weight) INVISIBLE;ALTER TABLE javastack ADD INDEX tall_idx (tall) INVISIBLE;

要变更现有索引的可见性,可以在 ALTER TABLE ... ALTER INDEX 命令中使用 VISIBLE 或 INVISIBLE 关键字。

年龄索引变更为不可见(隐藏):

ALTER TABLE javastack ALTER INDEX age_idx INVISIBLE;

年龄索引变更为可见:

ALTER TABLE javastack ALTER INDEX age_idx VISIBLE;

怎么知道一个表中的索引是可见还是不可见,可以从 INFORMATION_SCHEMA.STATISTICS 表,或者 SHOW INDEX 命令输出中获得。例如:

mysql> SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'javastack';+------------+------------+| INDEX_NAME | IS_VISIBLE |+------------+------------+| age_idx | YES || weight_idx | NO || tall_idx | NO |+------------+------------+

隐藏索引有什么用?

从上面隐藏索引介绍我们知道,隐藏索引可以不被优化器所使用,那么我们可以把某个表的某个索引设置隐藏,然后再测试 SQL 语句的查询性能。

即可以利用隐藏索引快速测试删除索引后对 SQL 查询性能的影响,而无需进行索引删除、重建操作,如果需要该索引,再设置可见就好了,这在大表测试中无疑非常有用,因为对于大表索引的删除和重新添加很耗性能,甚至影响表的正常工作。

隐藏索引设置

如果一个索引被设置成隐藏了,但实际上又需要被优化器所使用,有几种表索引情况缺失对查询造成的影响:

1)SQL 查询语句中包含了索引提示指向不可见索引会发生错误;

2)性能模式数据中显示了受影响 SQL 查询语句的负载增高;

3)SQL 查询语句进行 EXPLIAN 时出现了不同的执行计划;

4)SQL 查询语句出现在了慢查询日志中(之前没有出现);

系统变量 optimizer_switch 的 use_invisible_indexes 标志的值,控制了优化器执行计划构建时是否使用隐藏索引。

如果 use_invisible_indexes 值设置为 off 关闭状态(默认值),优化器默认会忽略隐藏索引,即和加入该参数之前的效果一样。

如果 use_invisible_indexes 值设置为 on 打开状态,隐藏索引仍然保持不可见,但优化器会把隐藏索引加入到执行计划的构建中。

如果想要在某条单个 SQL 查询语句上启用隐藏索引,可以使用 SET_VAR 优化器提示来临时更新 optimizer_switch 的值,如下所示:

mysql> EXPLAIN SELECT /*+ SET_VAR(optimizer_switch = 'use_invisible_indexes=on') */ &.........

mysql 8.0空间索引_牛逼!MySQL 8.0 中的索引可以隐藏了…相关推荐

  1. mysql db模块下载_易语言MySql数据库操作类V1.0模块源码

    易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...

  2. mysql 5.7和8.0区别_前沿观察 | MySQL性能基准测试对比:5.7 VS 8.0

    点小蓝字加关注! 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库 ...

  3. 比MySQL小的数据库_牛x!一个比传统数据库快 100-1000 倍的数据库!

    原标题:牛x!一个比传统数据库快 100-1000 倍的数据库! 一.ClickHouse 是什么? 二.业务问题 三.ClickHouse实践 四.遇到的坑 五.总结 一.ClickHouse 是什 ...

  4. mysql中如何设置主键一直从0开始_怎么让mysql的id从0开始

    满意答案 有时候我们在测试网站的时候,删除测试数据导致id不是从0开始,那如果想id是从0开始怎么办呢? mysql默认自增ID是从1开始了,但当我们如果有插入表或使用delete删除id之后ID就会 ...

  5. gee引擎mysql数据库如何假设_流程引擎SmartEngine 2.0 UserGuide

    Overview SmartEngine 是阿里巴巴一款业务治理和服务编排引擎.业务治理引擎专注于解决互联网场景下和传统工作流行业的流程相关问题,服务编排引擎专注于用统一的标准来解决复杂链路服务上的服 ...

  6. mysql 事务回滚_简短截说阐述redis中事务的使用

    我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送 COMMIT 来确认之前所做的修改,或者 ...

  7. 向mysql数据库发送指令_常用的MySQL数据库命令大全

    飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...

  8. mysql 常规命令操作_常见的MySQL命令大全

    一.连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码1.例1:连接到本机上的MYSQL.首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot ...

  9. mysql 数据库命令大全_常用的MySQL数据库命令大全

    飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...

最新文章

  1. [java进阶]3.slf4j作用及其实现原理
  2. 【ES6专栏】全面解析ECMAScript 6模块系统
  3. filter solutions安装教程
  4. 世纪前线网络质量测试工具 是什么_成为一名软件测试工程师有什么前途?
  5. 如何使用SAP Gigya的登录服务和您的网站集成
  6. 头部ct能检查出什么_【安全用药】做CT检查时应注意什么?
  7. [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:
  8. 侍魂胧月传说显示服务器未开启,侍魂胧月传说打开游戏黑屏怎么办 黑屏相关问题解答...
  9. Spring中为什么要开启注解扫描
  10. Python之常用内置函数
  11. Vue 3 中文文档来啦!
  12. 淘宝运营,新链接和老连接如何做搜索,有什么区别?
  13. 用python告诉你,韦小宝跟他七个老婆哪个最亲?
  14. 私域运营第五讲:实体餐饮店如何通过搭建私域流量实现营收增长
  15. ISFP——思想起决定作用
  16. 淘宝双11大数据分析(环境篇)
  17. 江苏大学计算机学院复试题,本部基础A定稿-含答案(江苏大学计算机).doc
  18. 均值滤波、中值滤波【MATLAB】【图像处理】
  19. Python实用秘技,复杂zip文件的解压
  20. 《软件方法》第8章 分析 之 分析类图(1)

热门文章

  1. 5月7日MySQL 学习
  2. H5 71-网易注册界面4
  3. 解析对象体内与方法体内引用内部方法的不同
  4. sharepoint2013用场管理员进行文档库的爬网提示没有权限,拒绝的解决方法
  5. 社保系列11《ATR》
  6. 从401航班事故调查看项目总结
  7. Java基础语法之变量作用域、小大驼峰命名规则和java运算符(赋值、关系、三元、逻辑运算符)
  8. HTTP与HTTP协议
  9. 详解Python中函数和模块的特殊属性__annotations__
  10. 微课|中学生可以这样学Python(2.3.3节):map()函数