MySQL8.0 新特性随笔
1、概述
本文主要随笔记录一些MySQL8.0相较于5.7版本,有哪些不同之处。
2、索引
2.1、索引跳跃扫描
有这样一个复合索引: index_a_b_c(a, b, c);然后执行如下sql:
select * from T where b = '1' and c = '3'
5.7中不会
走这个复合索引。
8.0中如果a字段仅有几个不同值的情况下会
走这个复合索引。
因此在8.0中可以把区分度高的字段建立在复合索引的最前面,比如性别。
2.2、降序索引
8.0新增降序索引:
index_c1_c2(c1, c2 desc);
# 会走索引排序
order by c1,c2 desc;
order by c1 desc,c2;# 不会走索引排序
order by c1, c2;
2.3、group by 隐式排序
group by a1
5.7会在分组的时候做隐式排序,即先排序再分组。
8.0则不会做隐式排序了。(要排序就需要指定加 order by)
2.4、隐藏索引
8.0新增可以把指定索引设置成隐藏索引的功能,类似于索引软删,一般是用于测试索引被删了的情况下会不会影响业务,如果确实不影响,这时就可以真正的把索引物理删除掉。
设置成隐藏索引的效果:sql查询时不会走这个索引,就算声明force index也不会走这个索引。但是索引物理是存在的。
隐藏索引可以session级临时开启使用。
2.5、函数索引
5.7中对索引字段使用了函数后会导致索引失效。
8.0新增了函数索引的功能,专门用于给函数生效索引的情况:
# 给c1字段加一个UPPER()函数的索引,这个函数的作用是转为大写。
idx_upper_c1(UPPER(c1))
2.6、buffer pool大小自适应参数
8.0中新增该参数innodb_dedicated_server
默认关闭,设置成开启时,会自己尽量的去扩大内存占用,尽量的使用上机器资源,一般在一台仅部署了MySQL的机器中开启。
2.7、死锁检查
死锁检查参数innodb_deadlock_detect
是默认开启的,在生产环境下应该避免死锁,且锁等待时间不应该设置过长。 因此8.0提供了额外的可以关闭该死锁参数的接口。
2.8、undo log不再使用表空间
5.7的undo log其实是存在MySQL的系统表里面的,8.0就单独移出来,存在磁盘文件undo文件中了。
2.9、窗口函数
8.0新增了窗口函数,便于数据可以更好的进行分组、聚合。
关键字partition by
over
等
相比于group by,窗口函数不会合并结果。
2.10、DDL操作原子化
当t4表不存在时,执行一下sql:
drop table t1, t4;
5.7中t1删除成功,t4删除失败。
8.0中t1、t4都删除失败。