mysql 8新特性
一、为什么要使用mysql 8?
1、5.7及以前的版本在2023年已经停止维护代码;
2、8 性能很好,全内存访问,200W的QPS 能跑到16万
二、有哪些新特性
1、账号安全:
- 5.7及以前用户创建和授权可以一行sql解决,8不行,得分开执行sql语句;
- 认证插件更行,密码的认证不一样,安全级别更高,caching_sha2_password;
- 密码允许重复修改为一样的;
2、隐藏索引:
查看表结构及详细信息:show create table table_name\G;
- 隐藏索引:
(1)不会被优化器使用,不可见,
(2)使用场景:
a、软删除:当对索引进行创建和删除时,如果误删了再创建会影响性能,新版改为可以变成软删除,过段时间可以进行恢复
b、灰度发布:线上测试,加隐藏,仅针对测试,如果发现索引没问题也是有必要的,可以变成正式索引;可以在session级别把隐藏索引打开,不影响正式的会话
实战:create index index_name on table_name(字段) invisible;
- 降序索引:
a、以前版本在创建B+Tree的时候默认是升序的,8以后索引可以是降序的;
b、实战:
- 函数索引:
a、之前讲过,不要在索引列上加操作,否则会导致索引失效
b、mysql8后,如果在索引列上加了函数,mysql会新增一个隐藏列来存储函数执行后的数据,并在该列上新建索引;
c、查询时,直接查隐藏列,不会导致索引失效,该列仅对mysql可见,对用户不可见;
d、在5.7中group by有默认排序(升序),mysql8在group by上面没有进行排序,必须group by order by
实战:
3、通用表 表达式:
(1)使用场景:公司部门组织结构、城市行政组织结构,表示上下级关系,使用递归的方式查询?
5.7使用union all,关联自身,层级是固定的,有几个层级就有几个union all
mysql8后,使用with recursive 视图表名称(列) as (
select * from t1
union all
select * from t1
)
意思就是将as后面的查询结果当成视图里面的列进行传递,达到递归的效果;
(2)实战:
4、函数窗口:
(1)多用于统计分析
(2)分析函数:与分组、聚合函数非常类似
(3)类似于使用partition by 代替group by,因为group by使用的时候有很多限制,比如select的时候,只能select group by的字段,如果要select更多字段,得在group by后面加;
(4)普通函数:
sum、avg、count、
(5)专用函数:
rank()、row_number()
5、DDL实现原子操作:
(1)drop、create、alter等DDL语句同时操作多张表,如果有一个表报错了,5.7之前会执行成功的表,而8后则所有都不执行成功,保证原子性;
(2)实战:
6、JSON增强:
(1)增加了一个数据类型json:
(2)增加了json的一些转换函数:
7、InnoDB的其他特性:
详见文档:https://dev.mysql.com/doc/refman/8.0/en/windows-funcation-descriptions.html
关闭QC(Query Cache)缓存查询
死锁检查:1、关闭死锁检查,2、通过配置innodb_lock_wait_timeout,当遇到死锁时,在很短的时间点立即返回,不再等待,提升性能;
GIS支持
Hash Join