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 禁用了优化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App