MySQL 8.0新增的三种索引方式

MySQL 8.x中新增了三种索引方式:隐藏索引、降序索引 及 函数索引。

1. 隐藏索引

隐藏索引又叫不可见索引,主要应用于索引的 软删除 和 灰度发布。

在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索引删错了,又只能通过创建索引的方式将删除的索引添加回来,如果数据库中的数据量非常大,或者表比较大,这种操作的成本非常高。在MySQL 8.0中,只需要将这个索引先设置为隐藏索引,使查询优化器不再使用这个索引,但是,此时这个索引还是需要MySQL后台进行维护,当确认将这个索引设置为隐藏索引系统不会受到影响时,再将索引彻底删除。这就是索引软删除功能。 

灰度发布,就是说创建索引时,首先将索引设置为隐藏索引,通过修改查询优化器的开关,使隐藏索引对查询优化器可见,通过explain对索引进行测试,确认这个索引有效,某些查询可以使用到这个索引,就可以将其设置为可见索引,完成灰度发布的效果。

创建隐藏索引具体代码如下(只需要在创建索引的后面加上invisible即可):

create index 索引名称 on 表名称('索引字段名') invisible;

此时创建的索引就是隐藏索引,我们可以查看当前表中索引列表:

show index from 表名称 \G;

\G:是格式化的意思

显示的索引中有一个Visible属性,YES表示这个索引可见,NO表示不可见。接下来我们在使用explain分析,发现刚刚创建的隐藏索引不生效。在灰度发布的场景中我们需要同过explain分析隐藏索引是否对某些SQL有帮助,但是隐藏索引又不生效,怎么办呢?

在MySQL8 中提供了一种新的测试方式,可以通过优化器的一个开关来打开某个设置,使隐藏索引对查询优化器可见。我们可以通过如下代码查看这个开关是否开启:

select @@optimizer_switch \G;

查询结果如下所示:

use_invisible_indexes=off

这个开关默认是off,off表示关闭,ON表示开启。

我们可以通过如下SQL在当前会话中开启和关闭(不影响其他会话进程):

set session optimizer_switch="use_invisible_indexes=on";

现在我们可以通过explain分析隐藏索引是否对某些SQL有帮助。

注意:主键不能设置隐藏索引哦

2. 降序索引

MySQL 8.0开始真正支持降序索引(descending index),并且只有InnoDB存储引擎支持降序索引,只支持BTREE降序索引。MySQL 8.0不再对GROUP BY操作进行隐式排序。

说实话,我个人绝对这个没有什么实际应用场景,一般我们查询数据都需要where条件,故而一般都会优先优化where条件字段的索引问题。不过我们还是来说说具体操作吧!

create table if not exists test(
c1 int, 
c2 int, 
index c1_c2(c1 asc, c2 desc)
);

如上所示,创建表的时候创建了索引 c1_c2 ,并且在索引中指定了c1是升序,c2是降序。

当我们使用如下SQL查询时:

explain select * from test order by c1, c2 desc;

在MySQL5.7中按照c2字段进行降序排序,并没有使用索引。但是在MySQL8中使用索引,并使用了索引的反向扫描。

我们再来看看下面这条SQL:

explain select * from test order by c1, c2 asc;

此时索引就不起作用了,是不是感觉有点鸡肋。如果我们使用了where条件查询,MySQL优化器会使用where条件中的字段优化查询,因此我感觉这个降序索引没有什么作用。

3. 函数索引

在前的版本中,我们的SQL中使用了某个函数(例如:upper,json相关函数),那么就不会走索引查询,为此MySQL8新增了一个函数索引,以此解决函数不走索引的问题。

3.1 创建函数索引,下面以转大写函数为例:

create index 索引名称 on 表名称( ( UPPER( 字段名 ) ) );

3.2 测试函数索引

explain select * from test where upper(c1) = 'ABC'

test是测试表,并且在c1字段上添加了小写转大写的函数索引

分析结果表明:当前SQL使用了函数索引。

3.3 再来看看对json的支持

创建测试表,如下所示:

create table if not exists test(
  data json, 
  index( (CAST(data->>'$.name' as char(30) ) ) )
);

JSON数据长度不固定,如果直接对JSON数据进行索引,可能会超出索引长度,通常,会只截取JSON数据的一部分进行索引。

CAST()类型转换函数,把数据转化为char(30)类型。使用方式为CAST(数据 as 数据类型)。

data ->> '$.name'表示JSON的运算符

简单的理解为,就是取name节点的值,将其转化为char(30)类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
nside君的MySQL网络培训班课程特点: 业界最权威的MySQL数据库培训师姜承尧老师(也就是Inside君本人啦)亲授.姜承尧老师出版了《MySQL技术内幕:InnoDB存储引擎》、《MySQL内核:InnoDB存储引擎》等Mysql书籍。 课程紧密结合互联网公司实践,学员能够领略到BAT、网易等大公司的数据库架构与应用案例 课纲结合最新的MySQL 5.6、5.7版本,使得学员学到的都是最新的内容 充分掌握课程内容的学员年薪至少在25W起,第1期的学员已经证明了培训的价值 优秀学员可以获得姜老师的BAT等大型互联网公司的内推 面试技巧与简历模板(新增),帮助学员拿到更好的offer MySQL 安装与引擎 day001-MySQL 5.7介绍和安装 day002-MySQL 5.7安装多实例 day003-MySQL升级 参数 连接 权限 day004-MySQL权限拾 遗Role模拟 Workbench 体系结构 day005-slow_log generic_log audit 存储引擎一 day006-存储引擎二 多实例安装上 day007-MySQL 多实例下 SSL MySQL 数据类型和SQL查询 开发 day008-MySQL 数据类型 day009-精通JSON类型 day010-Employees 临时表的创建 外键约束 day011-SQL语法之SELECT day012-子查询 INSERT UPDATE DELETE REPLACE day013-作业讲解一 Rank 视图 UNION 触发器上 day014-触发器下 存储过程 自定义函数 MySQL 执行计划与优化器 day015-索引 B+树 上 day016-索引 B+树 下 Explain 1 day017-Explain 2 MySQL innodb引擎优化 day018-磁盘 day019-磁盘测试 day020-InnoDB_1 表空间 General day021-InnoDB_2 SpaceID.PageNumber 压缩表) day022-InnoDB_3 透明表空间压缩 索引组织表 day023-InnoDB_4 页(2) 行记录 day024-InnoDB_5 – heap_number Buffer Poo day025-InnoDB_6 Buffer Pool与压缩页 CheckPoint LSN day026-InnoDB_7 doublewrite ChangeBuffer AHI FNP MySQL 索引与innodb锁机制 day027-Secondary Index day028-join算法锁_1 day029-锁_2 day030-锁_3 day031-锁_4 day032-锁_5 day032-锁5标清 day033-锁_6 事物_1 day033-锁_6 事物1标清 day034-事物_2 MySQL 性能衡量 day035-redo_binlog_xa day036-undo_sysbench day036-undosysbench标清 day037-tpcc_mysqlslap MySQL 备份与恢复 day038-purge死锁举例_MySQL backup备份_1 day039-MySQL backup备份恢复_2 MySQL 复制技术与高可用 day040-MySQL 备份恢复backup_3_replication_1 day041-backup_4-replication_2 day042-replication_3 day043-replication_4-GTID 1 day044-replication_5-GTID 2

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值