MySQL8.0版本新功能

一、InnoDB 增强功能

1.mysql_upgrade

1)在MySQL8.0.16之前,升级过程需要手动执行mysql_upgrade来升级MySQL、sys等schema。
2)MySQL8.0.16起,server会处理之前mysql_upgrade处理的任务。

2.ALTER TABLE (INSTANT 即时完成)

从 MySQL 8.0.12 开始, ALGORITHM=INSTANT 支持以下 ALTER TABLE 操作:

  • 即时加字段
  • 添加或删除虚拟列。
  • 添加或删除列默认值。
  • 修改 ENUM 或 SET 列的定义。
  • 更改索引类型。
  • 重命名表。

3.双重写缓冲区

从MySQL 8.0.20开始,双写缓冲区存储区域驻留在双写文件中。
在以前的发行版中,存储区域驻留在系统表空间中。将存储区域移出系统表空间可减少写入延迟,增加吞吐量,并在放置双重写入缓冲区页方面提供灵活性。
为高级双写缓冲区配置引入了以下系统变量:

  • innodb_doublewrite_dir
    定义双重写入缓冲区文件目录。
  • innodb_doublewrite_files
    定义双重写文件的数量。
  • innodb_doublewrite_pages
    定义批处理写入的每个线程的最大双重写入页数。
  • innodb_doublewrite_batch_size
    定义要在批处理中写入的双重写入页数。

4.CREATE TABLE ... SELECT

从MySQL 8.0.21开始,在支持原子DDL的存储引擎上,当使用基于行的复制时,该 CREATE TABLE ... SELECT 语句将作为一个事务记录在二进制日志中。
以前,它记录为两个事务,一个用于创建表,另一个用于插入数据。通过此更改,语句现在对于基于行的复制是安全的,
CREATE TABLE ... SELECT 并且允许与基于 GTID 的复制一起使用。

5.ALTER TABLE ... RENAME COLUMN

从 MySQL 8.0.28 开始, InnoDB 支持 ALTER TABLE ... RENAME COLUMN 使用 ALGORITHM=INSTANT .

6.ALTER TABLE ... DROP COLUMN

从 MySQL 8.0.29 开始, InnoDB 支持 ALTER TABLE ... DROP COLUMN 使用 ALGORITHM=INSTANT
在MySQL 8.0.29之前,立即添加的列只能添加为表的最后一列。从MySQL 8.0.29开始,可以将即时添加的列添加到表中的任何位置。

7.字符集支持。

默认字符集已从 latin1 更改为 utf8mb4 。

二、优化器增强功能

1.MySQL 现在支持不可见索引。

MySQL now supports invisible indexes

2.MySQL现在支持降序索引

3.exists的子查询半连接优化

从 MySQL 8.0.16 开始,在in子查询使用的半连接优化,也会应用在exists的子查询。

4.反连接

在MySQL 8.0.17及更高版本中,在where条件中含有NOT IN (subquery)或NOT EXISTS (subquery)会被转化成antijoin/反连接

5.从 MySQL 8.0.21 开始,单表的update和delete语句会用半连接模式或物化子查询

  • mysql5.7版本对于如下语句,会产生DEPENDENT SUBQUERY,依赖于外部查询行,如果外部查询行很多则查询SQL执行会很慢
  • mysql8.0.21开始则会优化成SIMPLE(select_type字段),即与顶层主表是关联关系。如子查询有较好的过滤条件,则执行速度大大加快。
    例 :UPDATE t1 SET t1.a=value WHERE t1.a IN (SELECT t2.a FROM t2)

6.MySQL 8.0.23改进了哈希联接性能,即hash join性能更优。

7.从MySQL 8.0.19开始,支持共用表表达式。

8.mysql8.0起支持窗口函数。

9.在 MySQL 8.0.16 及更高版本中,在单表delete语句中支持用别名。

10.支持备份锁。由LOCK INSTANCE FOR BACKUP 和 UNLOCK INSTANCE来支持

11.派生条件下推优化。

  • MySQL 8.0.22(及更高版本)为具有具体化派生表的查询实现了派生条件下推。对于诸如 SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > constant 之类的查询,
    现在在许多情况下可以将外部 WHERE 条件向下推送到派生表,这时会改写成 SELECT * FROM (SELECT i, j FROM t1 WHERE i > constant) AS dt 。
  • 当派生表不使用任何聚合函数或窗口函数时,可以将外部 WHERE 条件直接向下推送到实例化派生表。当派生表具有 且 GROUP BY 不使用任何窗口函数时,可以将外部 WHERE 条件作为 HAVING 条件向下推送到派生表。
  • 在 MySQL 8.0.29 之前,当查询包含union则该优化不能使用,在MySQL 8.0.29及更高版本中,在大多数情况下,条件可以向下推送到联合的两个查询块。
  • 默认情况下启用派生条件下推,如 optimizer_switch 系统变量的 derived_condition_pushdown 标志所示。默认情况下,在MySQL 8.0.22中添加的标志设置为 on ;要禁用特定查询的优化,您可以使用 NO_DERIVED_CONDITION_PUSHDOWN 优化器提示(也添加到 MySQL 8.0.22 中)。如果由于 derived_condition_pushdown 设置为 而 off 禁用了优化。
posted @   江曹  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示