导读:本文详细介绍 MySQL 8.0.19 三大索引新功能,隐藏索引,降序索引,函数索引,结合其他同仁的技术应用案例,进一步进行验证改编,最后总结心得,希望对大家有帮助。

MySQL 8.0 版本带来了3大索引新功能:隐藏索引,降序索引,函数索引,看字面意义,大致也都能猜到那些功能,下面测试实际了解一下。

隐藏索引


MySQL 8.0 支持隐藏索引(invisible index),也称为不可见索引。隐藏索引不会被优化器使用。主键不能设置为隐藏(包括显式设置或隐式设置)

CREATE TABLE `tb_index` (  `id` bigint NOT NULL ,  `name` varchar(255) DEFAULT NULL,  `age` tinyint DEFAULT '10',  `create_time` datetime DEFAULT NULL,  `update_time` datetime DEFAULT NULL,  `addr` varchar(30) DEFAULT NULL,  `sex` enum('M','F') DEFAULT NULL,  PRIMARY KEY(id),  UNIQUE uni_age (age),  INDEX idx_addr (addr) ,  INDEX idx_sex (sex) INVISIBLE,  FULLTEXT KEY `fullindex_name` (`name`)) ;

##两种方式验证

mysql>SHOW INDEX FROM `tb_index`;mysql>SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'tb_index'

##隐藏和可见操作

mysql>ALTER TABLE tb_index ALTER INDEX idx_addr INVISIBLE;mysql>ALTER TABLE tb_index ALTER INDEX idx_addr VISIBLE;

除了主键,其他索引都可以。

对于唯一建:例外情况: 没有主键的情况下,第一个唯一建 不可隐藏,第二个唯一建可隐藏。
从这里可以了解到 MySQL在没有主键的情况下 是把第一个唯一建做为主键。

CREATE TABLE `tb_index2` (  `id` bigint NOT NULL ,  `name` varchar(255)  NOT NULL,  `age` tinyint DEFAULT '10' NOT NULL ,  `create_time` datetime  NOT NULL,  `update_time` datetime  NOT NULL,  `addr` varchar(30)  NOT NULL,  `sex` enum('M','F')  NOT NULL,  UNIQUE uni_age (age),  UNIQUE uni_id(id),  INDEX idx_addr (addr) ,  INDEX idx_sex (sex) INVISIBLE,  FULLTEXT KEY `fullindex_name` (`name`)) ;##隐藏和可见操作```sqlmysql>ALTER TABLE tb_index ALTER INDEX uni_age INVISIBLE;mysql>ALTER TABLE tb_index ALTER INDEX uni_age VISIBLE;

mysql>ALTER TABLE tb_index ALTER INDEX uni_id INVISIBLE;mysql>ALTER TABLE tb_index ALTER INDEX uni_id VISIBLE;

执行计划:
系统变量 optimizer_switch 的 use_invisible_indexes 值控制了优化器构建执行计划时是否使用隐藏索引。如果设置为 off (默认值),优化器将会忽略隐藏索引(与引入该属性之前的行为相同)。如果设置为 on,隐藏索引仍然不可见,但是优化器在构建执行计划时将会考虑这些索引。

mysql> SHOW VARIABLES LIKE '%optimizer_switch%';

##当name索引隐藏的时候

mysql>ALTER TABLE tb_index ALTER INDEX idx_name INVISIBLE;

#当name索引显示的时候

mysql>ALTER TABLE tb_index ALTER INDEX idx_name VISIBLE;

#optimizer_switch进行控制

mysql>ALTER TABLE tb_index ALTER INDEX idx_name INVISIBLE;
mysql>set optimizer_switch='use_invisible_indexes=on';

mysql> explain select * from tb_index where age =12 and name ='9961139@qq.com';

好的方面的optimizer_switch=‘use_invisible_indexes=on’ session级别,特定的时间可以通过参数进行使用。

总结:

不可见索引特性可以用于测试删除某个索引对于查询性能的影响,同时又不需要真正删除索引,也就避免了错误删除之后的索引重建。对于一个大表上的索引进行删除重建将会非常耗时,而将其设置为不可见或可见将会非常简单快捷。

如果某个设置为隐藏的索引实际上仍然需要或者被优化器所使用,可以通过以下多种方法发现缺少该索引带来的影响:

  • 索引提示中使用了该索引的查询将会产生错误;

  • 性能模式(Performance Schema)中的数据显示受影响查询的负载升高;

  • EXPLAIN 语句显示了不同的查询执行计划;

  • 慢查询日志中出现了新的查询语句。

需要思考的问题:
增删改操作,本身会进行索引的维护,隐藏索引是否有必要创建。

降序索引


MySQL8.0开始真正支持降序索引,只有InnoDB引擎支持降序索引,且必须是BTREE降序索引,MySQL8.0不在对group by操作进行隐式排序。

查看官方:
MySQL支持降序索引:索引定义中的DESC不再被忽略,而是按降序存储键值。以前,可以以相反的顺序扫描索引,但是会导致性能损失。下行索引可以按前向顺序扫描,效率更高。当最有效的扫描顺序混合了某些列的升序和其他列的降序时,降序索引也使优化器能够使用多列索引。

注意:

  • Ddescending索引只支持InnoDB存储引擎

  • 具有降序关键部分的索引不用于对调用聚合函数但没有GROUP BY子句的查询进行MIN()/MAX()优化

  • 降序索引:BTREE支持,但不支持哈希索引,全文索引或空间索引

  • DISTINCT可以使用包含匹配列(包括降序关键部分)的任何索引。

  • 对于所有可用升序索引的数据类型,都支持降序索引。

语法如下,用法简单,需要考虑索引维护的成本和实际使用场景。对于MAX,MIN,DISTINCT 降序索引进行优化。

CREATE TABLE t (  c1 INT, c2 INT,  INDEX idx1 (c1 ASC, c2 ASC),  INDEX idx2 (c1 ASC, c2 DESC),  INDEX idx3 (c1 DESC, c2 ASC),  INDEX idx4 (c1 DESC, c2 DESC));函数索引MySQL版本需要是5.7及以上版本才支持建立函数索引(虚拟列方式),MySQL 8.0.13 以及更高版本支持函数索引(functional
key parts),也就是将表达式的值作为索引的内容,而不是列值或列值前缀。将函数作为索引键可以用于索引那些没有在表中直接存储的内容。##引用上面的表tb_index
mysql>ALTER TABLE tb_index  ADD INDEX idx_created (create_time);Mysql>EXPLAIN SELECT id ,name ,age ,create_time,update_time ,month(create_time)FROM tb_indexWHERE  month(create_time) =8

mysql>ALTER TABLE tb_index  ADD INDEX idx_created_fun((month(create_time)));

  • 函数索引支持UNIQUE选项。但是,主键不能包含函数列。主键只能使用存储的计算列,但是函数索引使用虚拟计算列实现,而不是存储计算列。

  • 空间SPATIAL 索引和 全文FULLTEXT 索引不支持函数索引。

  • 如果某个表中没有主键,InnoDB 存储引擎自动将第一个 UNIQUE NOT NULL 索引提升为主键。但是对于包含函数列的 UNIQUE NOT NULL 索引不会进行提升。

  • 如果要删除的字段上有函数索引,必须先删除函数索引,才能删除字段。


总结:


以上介绍内容虽然给带来了多样性的功能,但怎样更有效的使用,才是问题关键。特别是隐藏索引,多一个索引就是多出一份维护成本。

墨天轮原文链接:https://www.modb.pro/db/22619(复制到浏览器中打开或者点击“阅读原文”)

推荐阅读:144页!分享珍藏已久的数据库技术年刊


点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

两千字揭密 MySQL 8.0.19 三大索引新功能:隐藏索引,降序索引,函数索引相关推荐

  1. groupby索引有效吗_两千字揭密 MySQL 8.0.19 三大索引新功能

    原文链接:https://www.modb.pro/db/22619 导读:本文详细介绍 MySQL 8.0.19 三大索引新功能,隐藏索引,降序索引,函数索引,结合其他同仁的技术应用案例,进一步进行 ...

  2. 京东回应「被薅 7000 万、项目组全体开除」;微信朋友圈屏蔽支付宝集五福;MySQL 8.0.19 发布 | 极客头条...

    整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...

  3. 1月14日科技资讯|京东回应「被薅 7000 万、项目组全体开除」;微信朋友圈屏蔽支付宝集五福;MySQL 8.0.19 发布

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧.扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Sty ...

  4. MySql 8.0.19安装

    MySql 8.0.19安装 1.在官网下载相应的安装助手 下载链接如下: https://dev.mysql.com/downloads/installer/ 在其中选择相应的版本即可! 2.点击运 ...

  5. MySQL 8.0.19 下载与安装(Windows系统)

    目录 前言 一.MySQL下载 1. 进入MySQL官网 2. 进入下载页面 3. 选择安装方式 4. 选择安装版本 5. 下载 二.MySQL安装 1. 双击安装包 2. 等待进入配置界面 3. 选 ...

  6. mysql 8.0.19 winx64安装及修改初始密码

    本文为大家分享了mysql 8.0.19 winx64安装教程,供大家参考,具体内容如下 1. 下载mysql-8.0.19-winx64 1.1 进入地址:https://dev.mysql.com ...

  7. MySQL 8.0.19 + win 7 +安装教程

    安装软件 :MySQL 8.0.19 安装环境:win 7 -64bit MySQL软件下载路径: MySQL官网 8.0.19版本下载路径 也可以直接百度网盘下载: 链接:https://pan.b ...

  8. mysql8不区分大小写_技术译文 | MySQL 8.0.19 GA!

    作者:Geir Hoydalsvik 原文:https://mysqlserverteam.com/the-mysql-8-0-19-maintenance-release-is-generally- ...

  9. MySQL 8.0.12 有什么新内容?

    关注"数据和云"获得更多内容 引言 时隔三个月,MySQL 8.0.12 有什么新内容? 今年4月份,MySQL突然直接从8.0.5跳过多个版本号到8.0.11,直接宣布8.0.1 ...

最新文章

  1. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)
  2. Springboot 解决跨域的四种姿势
  3. django 链接多个数据库 并使用原生sql
  4. 做人工智能必看的 45 篇论文,附下载地址 | 文末有彩蛋
  5. xp系统怎样添加桌面计算机名,教你win10系统电脑桌面怎么添加日历
  6. iframe 禁止打开新窗口_打开新窗口的安全和性能问题
  7. JavaScript中call,apply,bind方法的总结。
  8. java基础知识补漏(1)---内部类,重写、重载
  9. avrdude: stk500_getsync(): not in sync: resp=0x00
  10. SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
  11. Xshell6 + Xftp6 绿色破解永久授权激活版 免安装 解压即用,最好的SSH工具(Xshell 6 plus套件)
  12. 拟合美国人口matlab编码,美国人口数据的阻滞增长模型拟合分析
  13. 没有GPS模块无人机无法解锁解决方法测试及其他无法解锁APM疑难杂症
  14. 频繁切换网卡,一款快速设置IP地址的工具,爽到爆。
  15. esp32 物联网应用 01
  16. HTML5CSS3:Day03 2D动画 3D动画 CSS3过渡
  17. STM32CubeMX全部版本下载地址
  18. 私藏的自媒体图片素材网站,一键下载,免费使用
  19. 备婚倒数日或纪念日记录的提醒APP
  20. ucos 和uclinux的区别及各自的特点

热门文章

  1. ldap radius_在LDAP上使用RADIUS的好处
  2. CSS 兼容浏览器的方法 CSS Hack
  3. HTML 表格的基本布局
  4. 安全整数和 Number.isSafeInteger()
  5. java servlet 配置_servlet与javabean配置
  6. uniapp 如何给搜索框设值_uni-app搜索功能前后端开发(页面)
  7. mybatis plus 格式话_作为阿里的面试官,我有话想说
  8. java csv 双引号_Java-使用Scess编写CSV时从字符串类型数据中删除双引号
  9. vb6.0企业版win7_比win7更快?官方精简win10:3G+不更新,旧电脑福音
  10. 腾讯python面试题_面试题 | 腾讯数据分析面试题分享