必看!MySQL8.0特性浅析(持续更新)

一、MySQL8.0基本介绍

  MySQL 8.0拥有目前最快的采用率,2019年8月的采用率就已经达到了26%,5.7为47%,5.6为24%。

  • 2016-09-12,第一个DM(development milestone)版本MySQL8.0.0,开发里程碑…
  • 2018-04-19第一个GA(General Availability)版本,8.0.11发布;
  • 2018-07-27第二个GA(General Availability)版本,8.0.12发布;
  • 2018-10-22第三个GA(General Availability)版本,8.0.13发布;
  • 2019-01-21第四个GA(General Availability)版本,8.0.14发布;
  • 2019-02-01第五个GA(General Availability)版本,8.0.15发布;
  • 2019-04-25第六个GA(General Availability)版本,8.0.16发布;
  • 2019-07-22第七个GA(General Availability)版本,8.0.17发布;
  • 2019-10-14第八个GA(General Availability)版本,8.0.18发布;
  • 2020-01-13第九个GA(General Availability)版本,8.0.19发布;
  • 2020-04-27第十个GA(General Availability)版本,8.0.20发布;
  • 2020-07-13第十一个GA(General Availability)版本,8.0.21发布;
    在这里插入图片描述

二、MySQL8.0关键特性

2.1 默认字符集由latin1变为utf8mb4

  在8.0版本之前,默认字符集为latin1,8.0版本默认字符集为utf8mb4,校对规则为utf8mb4_0900_ai_ci。Utf8以前指向的是utf8mb3,未来utf8默认指向也将会是utf8mb4。
MySQL5
在这里插入图片描述
MySQL8
在这里插入图片描述

2.2 MyISAM系统表全部换成InnoDB表

  系统表全部换成事务型的innodb表,默认的MySQL实例将不包含任何MyISAM表,除非手动创建MyISAM表。
MySQL5
在这里插入图片描述
MySQL8
在这里插入图片描述

2.3 自增变量持久化

  在8.0之前的版本,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。8.0版本将会对AUTO_INCREMENT值进行持久化,MySQL重启后,该值将不会改变。
MySQL5
在这里插入图片描述
在这里插入图片描述

MySQL8
在这里插入图片描述
在这里插入图片描述

2.4 DDL原子化

  在8.0中InnoDB表的DDL支持事务完整性,要么成功要么回滚,将DDL操作回滚日志写入到data dictionary 数据字典表 mysql.innodb_ddl_log 中用于回滚操作,该表是隐藏的表,通过show tables无法看到。通过设置参数将ddl操作日志打印输出到mysql错误日志中。
  来看另外一个例子,库里只有一个t1表,drop table t1,t2; 试图删除t1,t2两张表,在8.0以前,执行报错,但是t1表被删除,在8.0中执行报错,但是t1表没有被删除,证明了8.0 DDL操作的原子性,要么全部成功,要么回滚。
MySQL5
在这里插入图片描述
MySQL8
在这里插入图片描述
在这里插入图片描述

2.5 参数修改持久化

  MySQL 8.0版本支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中,重启MySQL时,可以从该配置文件获取到最新的配置参数。例如执行:SET PERSIST @@global.sync_binlog=100;系统会在数据目录下生成一个包含json格式的 mysqld-auto.cnf 的文件,格式化后如下所示,当 my.cnf 和 mysqld-auto.cnf 同时存在时,后者具有更高优先级。
在这里插入图片描述

2.6 降序索引

  MySQL在语法上很早就已经支持降序索引,但实际上创建的仍然是升序索引,如下MySQL 5.7 所示,c2字段降序,但是从show create table看c2仍然是升序。8.0可以看到,c2字段降序。
MySQL5
在这里插入图片描述
在这里插入图片描述
MySQL8
在这里插入图片描述
在这里插入图片描述

2.7 group by 不再隐式排序

  在8.0版本之前,group by默认会进行排序,8.0之后,不再进行隐式排序。
MySQL5
在这里插入图片描述
MySQL8
在这里插入图片描述

2.8 JSON特性增强

  MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。
  在主从复制中,新增参数 binlog_row_value_options,控制JSON数据的传输方式,允许对于Json类型部分修改,在binlog中只记录修改的部分,减少json大数据在只有少量修改的情况下,对资源的占用。

2.9 redo & undo 日志加密

  增加以下两个参数,用于控制redo、undo日志的加密。

  • innodb_undo_log_encrypt
  • innodb_undo_log_encrypt

2.10 innodb select for update跳过锁等待

  select … for update,select … for share(8.0新增语法) 添加 NOWAIT、SKIP LOCKED语法,跳过锁等待,或者跳过锁定。在5.7及之前的版本,select…for update,如果获取不到锁,会一直等待,直到innodb_lock_wait_timeout超时。在8.0版本,通过添加nowait,skip locked语法,能够立即返回。如果查询的行已经加锁,那么nowait会立即报错返回,而skip locked也会立即返回,只是返回的结果中不包含被锁定的行。
在这里插入图片描述
在这里插入图片描述

2.11 增加SET_VAR语法

  在sql语法中增加SET_VAR语法,动态调整部分参数,有利于提升语句性能。

  • select /*+ SET_VAR(sort_buffer_size = 16M) */ id from test order id ;
  • insert /*+ SET_VAR(foreign_key_checks=OFF) */ into test(name) values(1);

2.12 新增innodb_dedicated_server参数

  能够让InnoDB根据服务器上检测到的内存大小自动配置innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method三个参数。

2.13 undo空间自动回收

  innodb_undo_log_truncate参数在8.0.2版本默认值由OFF变为ON,默认开启undo日志表空间自动回收。
  innodb_undo_tablespaces参数在8.0.2版本默认为2,当一个undo表空间被回收时,还有另外一个提供正常服务。
  innodb_max_undo_log_size参数定义了undo表空间回收的最大值,当undo表空间超过这个值,该表空间被标记为可回收。

2.14 支持不可见索引

  使用INVISIBLE关键字在创建表或者进行表变更中设置索引是否可见。索引不可见只是在查询时优化器不使用该索引,即使使用force index,优化器也不会使用该索引,同时优化器也不会报索引不存在的错误,因为索引仍然真实存在,在必要时,也可以快速的恢复成可见。
在这里插入图片描述

2.15 支持直方图

  优化器会利用column_statistics的数据,判断字段的值的分布,得到更准确的执行计划。
  可以使用 ANALYZE TABLE table_name [UPDATE HISTOGRAM on col_name with N BUCKETS |DROP HISTOGRAM ON clo_name] 来收集或者删除直方图信息。
  直方图统计了表中某些字段的数据分布情况,为优化选择高效的执行计划提供参考,直方图与索引有着本质的区别,维护一个索引有代价。每一次的insert、update、delete都会需要更新索引,会对性能有一定的影响。而直方图一次创建永不更新,除非明确去更新它。所以不会影响insert、update、delete的性能。
在这里插入图片描述

2.16 日志分类更详细

  在错误信息中添加了错误信息编号[MY-010311]和错误所属子系统[Server]
在这里插入图片描述

2.17 认证加密插件变更

  MySQL8.0开始将caching_sha2_password作为默认的身份验证插件,caching_sha2_password提供了比mysql_native_password插件更安全的密码加密,并caching_sha2_password提供了更好的性能。由于这些优越的安全性和性能特性,caching_sha2_password它是MySQL8.0首选的身份验证插件,而且也是默认的身份验证插件而不是 mysql_native_password。此更改会影响服务器和libmysqlclient客户端库;目前来说和经常使用的客户端软件兼容性不好。

2.18 增加资源组与角色管理

  MySQL 8.0新增了一个资源组功能,用于调控线程优先级以及绑定CPU核。MySQL用户需要有 RESOURCE_GROUP_ADMIN权限才能创建、修改、删除资源组。在Linux环境下,MySQL进程需要有 CAP_SYS_NICE 权限才能使用资源组完整功能。
在这里插入图片描述
  角色可以认为是一些权限的集合,为用户赋予统一的角色,权限的修改直接通过角色来进行,无需为每个用户单独授权。
默认提供两个资源组,分别是USR_default,SYS_default。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.19 实例克隆

  在很多场景中,我们需要克隆一个MySQL实例出来,比如在MGR中,我们需要先使用备份创建一个新实例后,才能将其加入组复制。传统的主从架构,如果需要增加一个从库,也是利用备份恢复,创建一个新的实例,再将这个实例加入到主从复制中。8.0.17版本实现的克隆功能支持本地或远程,克隆的数据是存储在物理快照的数据,能够更加快捷、高效的实现MySQL实例克隆。
  MySQL 8.0.17版本开发的克隆插件解决了这个问题,简化了实例复制的过程。仅仅通过mysql客户端,执行几个命令,就能把一台正在运行的MySQL实例自动克隆到另外一个新实例上,不需要太多的步骤和人工参与。
注意事项:

  • MySQL的配置参数不会被克隆。
  • Binlog文件不会被克隆。
  • 仅支持InnoDB存储引擎,MyISAM和CSV引擎的表,被克隆过来后,是空表。
  • 克隆过程中,所有的DDL操作被阻塞。
  • 做克隆操作时,实例自己的数据以及Binlog都会丢失,如果需要,请在克隆前做好备份。

2.20 NoSQL 文档存储

  MySQL 文档存储为开发者提供了最大的灵活性,即支持传统的 SQL 关系型应用,也支持 NoSQL 模式自由的文档数据库应用。因此,不再需要配置单独的 NoSQL 文档数据库。MySQL 文档存储为无模式的 JSON 文档,提供了多文档事务支持和完全 ACID 兼容。
在这里插入图片描述

2.21 窗口函数

  与分组聚合函数类似,窗口函数对一组行执行一些计算,例如COUNT 或 SUM 。但是,如果分组聚合将这组行折叠为单行,则窗口函数将对结果集中的每一行执行聚合。窗口函数有两种形式:用作窗口函数的SQL聚合函数和专用窗口函数。这是MySQL中支持窗口的一组聚合函数:COUNT,SUM,AVG ,MIN , MAX,BIT_OR,BIT_AND,BIT_XOR,STDDEV_POP(及其同义词 STD,STDDEV), STDDEV_SAMP,VAR_POP(及其同义词 VARIANCE )和VAR_SAMP。一组专门的窗口函数是:RANK,DENSE_RANK, PERCENT_RANK,CUME_DIST,NTILE,ROW_NUMBER,FIRST_VALUE,LAST_VALUE,NTH_VALUE,LEAD和LAG。
在这里插入图片描述

2.22 公用表表达式(CTE)

  MySQL 8.0提供公用表表达式(CTE)。MySQL8.0之前,进行复杂查询时需要使用子查询来实现,SQL语句不仅语句复杂性能低,而且不够清晰。CTE的出现简化了复杂查询语句的编写,提高了SQL性能。
  与子查询或者派生查询相比,CTE可以重用上次的查询结果即查询一次即可,同时,CTE可以相互引用。
在这里插入图片描述
在这里插入图片描述

2.23 跳跃范围扫描

  跳跃范围扫描是MySQL在8.0.13版本新增加的用于提高性能的新特性,跳跃范围扫描可以使以前部分无法使用到联合索引的SQL利用联合索引进行查询,并且可以更高效的利用联合索引,这对于使用MySQL联合索引进行查询的应用意义重大。
在这里插入图片描述

2.24 hash join

  在8.0.18之前,MySQL只支持Nest Loop Join算法,最简单的就是Simple NestLoop Join,MySQL针对这个算法做了若干优化,实现了Block Nest Loop Join,Index NestLoop Join和Batched Key Access等,有了这些优化,在一定程度上能缓解对HashJoin的迫切程度。
  Hash Join是针对等值join场景的优化,基本思想是,将外表数据加载到内存,并建立hash表,这样只需要遍历一遍内表,就可以完成join操作,输出匹配的记录。

2.25 其他特性

1、部分系统表的移除,系统表增强
2、redo并行写入,新增慢日志参数,更详细
3、复制优化,count(*)优化
4、默认支持分布式事务
5、移除查询缓存和mysql_upgrade,新增check完整性
6、临时表默认索引为innodb
7、默认开启UNDO表空间,且支持在线调整数量
8、Grant不再隐式创建用户,新增辅助密码
9、移除PASSWORD()函数
10、动态权限
11、MySQL8.0支持可配置的成本常量,对优化器开销进行了优化,支持更多的hint,另外优化器在制定执行计划时,会考虑数据是否在Buffer Pool中。
12、MySQL 8.0对GIS的支持有非常高的提升,功能上直追 甚至超越PostgreSQL。
13、MGR优化
14、redo归档
15、新架构 innodb replicaSet
16、double write独立
17、explain analyze支持
18、备份锁支持

猜你喜欢

转载自blog.csdn.net/qq_42979842/article/details/108332159