18.1 功能增强
- 系统表更换为 InnoDB 引擎
系统表全部换成事务型的 InnoDB 表,默认的 MySQL 实例将不包含任何 MyISAM 表,除非手动创建 MyISAM 表。
- DDL 原子化
InnoDB 表的 DDL 支持事务完整性,要么成功要么回滚,将 DDL 操作回滚日志写入到 data dictionary 数据字典表 mysql.innodb_ddl_log 中用于回滚操作,该表是隐藏的表,通过 show tables 无法看到。通过设置参数,可将 ddl 操作日志打印输出到 MySQL 错误日志中。
- CTE(Common Table Expression)
CTE(Common Table Expression) 可以认为是派生表(derived table)的替代,在一定程度上,CTE 简化了复杂的 join 查询和子查询,另外 CTE 可以很方便地实现递归查询,提高了 SQL 的可读性和执行性能。CTE 是 ANSI SQL 99 标准的一部分,在 MySQL 8.0.1 版本被引入。
- Clone 插件
MySQL 8.0 clone 插件提供从一个实例克隆出另外一个实例的功能,克隆功能提供了更有效的方式来快速创建 MySQL 实例,搭建主从复制和组复制。
- 直方图
直方图统计了表中某些字段的数据分布情况,为优化选择高效的执行计划提供参考,直方图与索引有着本质的区别,维护一个索引有代价,每一次的 insert、update、delete 都会需要更新索引,会对性能有一定的影响,而直方图则小很多。
- 资源组
MySQL 8.0 新增了一个资源组功能,用于调控线程优先级以及绑定 CPU 核。MySQL 用户需要有 RESOURCE_GROUP_ADMIN 权限才能创建、修改、删除资源组。在 Linux 环境下,MySQL 进程需要有 CAP_SYS_NICE 权限才能使用资源组完整功能。
- 角色管理
角色可以认为是一些权限的集合,为用户赋予统一的角色,权限的修改直接通过角色来进行,无需为每个用户单独授权。
- 不可见索引
使用 INVISIBLE 关键字在创建表或者进行表变更中设置索引是否可见。索引不可见只是在查询时优化器不使用该索引,即使使用 force index,优化器也不会使用该索引,同时优化器也不会报索引不存在的错误,因为索引仍然真实存在,在必要时,也可以快速的恢复成可见。
- SET_VAR 语法
在 sql 语法中增加 SET_VAR 语法,动态调整部分参数,有利于提升语句性能。
- 参数修改持久化
MySQL 8.0 版本支持在线修改全局参数并持久化,通过加上 PERSIST 关键字,可以将修改的参数持久化到新的配置文件 mysqld-auto.cnf 中,重启 MySQL 时,可以从该配置文件获取到最新的配置参数。
- 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 也会立即返回,只是返回的结果中不包含被锁定的行。
- 新增降序索引
MySQL 在语法上很早就已经支持降序索引,但实际上创建的仍然是升序索引,8.0 真正提供降序索引。
- group by 不再隐式排序
MySQL 8.0 对于 group by 字段不再隐式排序,如需要排序,必须显式加上 order by 子句。
- 自增变量持久化
在 8.0 之前的版本,自增主键 AUTO_INCREMENT 的值如果大于 max(primary key) + 1,在 MySQL 重启后,会重置 AUTO_INCREMENT = max(primary key) + 1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。自增主键重启重置的问题很早就被发现,一直到 8.0 才被解决,8.0 版本将会对 AUTO_INCREMENT 值进行持久化,MySQL 重启后,该值将不会改变。
- binlog 日志事务压缩
MySQL 8.0.20 版本增加了 binlog 日志事务压缩功能,将事务信息使用 zstd 算法进行压缩,然后再写入 binlog 日志文件,这种被压缩后的事务信息,在 binlog 中对应为一个新的 event 类型,叫做 Transaction_payload_event。
- 分区表改进
MySQL 8.0 对于分区表功能进行了较大的修改,在 8.0 之前,分区表在 Server 层实现,支持多种存储引擎,从 8.0 版本开始,分区表功能移到引擎层实现,目前 MySQL 8.0 版本只有 InnoDB 存储引擎支持分区表。
- 自动参数设置
新增 innodb_dedicated_server 参数,能够让 InnoDB 根据服务器上检测到的内存大小自动配置innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method 三个参数。
- 窗口函数
MySQL 8.0 版本开始支持窗口函数,主流关系型数据库,比如 Oralce, PostgreSQL 等都支持窗口数据功能,窗口函数对于数据分析处理具有重要作用。
18.2 性能提高
- 基于竞争感知的事务调度(CATS)
MySQL 在 8.0.3 版本引入了新的事务调度算法,基于竞争感知的事务调度,Contention-Aware Transaction Scheduling,简称 CATS。在 CATS 算法之前,MySQL 使用 FIFO 算法,先到的事务先获得锁,如果发生锁等待,则按照 FIFO 算法进行排队。CATS 相比 FIFO 更加复杂,也更加聪明,在高负载、高争用的场景下,性能提升显著。
- 基于 WriteSet 的并行复制
MySQL 8.0 版本引入了一个新的机制 WriteSet,来追踪事务之间的依赖性,这个特性被用于优化从库应用 binlog 的速度,在主库并发较低的场景下,能够显著提高从库回放 binlog 的速度,基于 WriteSet 的并行复制方案,彻底解决了 MySQL 复制延迟问题。
- JSON 特性增强
MySQL 8.0 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。在主从复制中,新增参数 binlog_row_value_options,控制 JSON 数据的传输方式,允许对于 JSON 类型部分修改,在 binlog 中只记录修改的部分,减少 json 大数据在只有少量修改的情况下,对资源的占用。
- 空间数据类型增强
MySQL 8.0 大幅改进了空间数据类型和函数,支持更多的空间分析函数和空间类型对象,空间分析功能和性能得到大幅提升。
- doublewrite 改进
在 MySQL 8.0.20 版本之前,doublewrite 存储区位于系统表空间,从 8.0.20 版本开始,doublewrite 有自己独立的表空间文件,这种变更,能够降低 doublewrite 的写入延迟,增加吞吐量,为设置 doublewrite 文件的存放位置提供了更高的灵活性。
- hash join
MySQL 8.0.18 版本引入 hash join 功能,对于没有走索引的等值 join 连接可以使用 hash join 进行优化。8.0.20 版本对 hash join 进行了加强,即使 join 连接没有使用等值条件也可以使用 hash join 优化,原来使用 BNL 算法的 join 连接将全部由 hash join 代替。
18.3 安全性增强
- redo log 和 undo log加密
增加 innodb_undo_log_encrypt、innodb_undo_log_encrypt,用于控制 redo、undo 日志的加密。
- 默认密码认证插件
MySQL 8.0.4 版本修改了默认的身份认证插件,从老的 mysql_native_password 插件变为新的 caching_sha2_password,并将其作为默认的身份认证机制,同时客户端对应的 libmysqlclient 也默认使用新的认证插件。
- 密码过期,历史密码使用规则
设置历史密码检测规则,防止反复重用旧密码。password_history、password_reuse_interval 双密码机制,修改密码时,创建新的密码,同时旧的密码也可以使用,保留一定的缓冲时间进行检查确认。当修改一个账户密码时,需要去验证当前的密码,通过参数 password_require_current 来控制,默认关闭,当打开该选项时,如果要修改账户密码,必须要提供当前的密码才允许修改。

被折叠的 条评论
为什么被折叠?



