MySQL 8.0 是一个重大的版本升级,带来了大量性能提升、功能增强和安全改进。相比于 MySQL 5.7,它可以说是“代际”的飞跃。
以下是 MySQL 8.0 主要升级内容的详细梳理和总结,可以分为几个核心类别:
一、性能与 scalability(可扩展性)的重大提升
-
全新的数据字典
- 5.7及之前:表结构信息(元数据)存储在
.frm文件、MyISAM系统表和一些存储引擎中。 - 8.0:将所有数据字典信息整合到 InnoDB 引擎的表中,并存储在一个单独的
mysql.ibd表空间里。 - 好处:
- 原子性DDL:支持了事务性的 DDL(如
CREATE,ALTER,DROP),要么完全成功,要么回滚,避免了元数据不一致的风险。这是一个里程碑式的特性。 - 崩溃安全:元数据现在由支持事务的 InnoDB 管理,系统崩溃不会导致数据字典损坏。
- 性能提升:消除了文件系统操作和元数据锁(MDL)的争用,提高了信息模式(
INFORMATION_SCHEMA)的查询速度。
- 原子性DDL:支持了事务性的 DDL(如
- 5.7及之前:表结构信息(元数据)存储在
-
增强的索引功能
- 隐藏索引:可以将一个索引标记为“不可见”,优化器在生成执行计划时会忽略它。用于测试删除某个索引后对查询性能的实际影响,而无需真正删除它(删除和重建大表索引代价很高)。
- 降序索引:真正支持降序索引。在 5.7 中,即使创建了降序索引,实际上也是按升序处理的。8.0 的降序索引可以显著优化
ORDER BY column DESC这类查询的性能。 - 函数索引:可以创建基于函数或表达式的索引。例如,可以为
JSON文档中的某个字段创建索引CREATE INDEX idx_name ON users ( (JSON_EXTRACT(data, '$.last_name')) ),极大地提升了相关查询的速度。
-
通用表表达式
- 支持 CTE:引入了
WITH子句,支持通用表表达式(Common Table Expressions),包括递归 CTE。这使得编写复杂的递归查询(如查询树形结构、组织架构)变得非常简单和高效,不再需要依赖繁琐的存储过程。
- 支持 CTE:引入了
-
窗口函数
- 分析函数:引入了强大的 SQL:1999 标准窗口函数,如
ROW_NUMBER(),RANK(),DENSE_RANK(),LEAD(),LAG(),NTILE()等。 - 好处:无需使用复杂的自连接或子查询就能完成高级分析任务,例如“计算每个部门薪水排名”、“计算移动平均”等,代码更简洁,性能大幅提升。
- 分析函数:引入了强大的 SQL:1999 标准窗口函数,如
-
redo log 优化
- redo log 持久化:redo log 写入现在是无锁的并且完全有序,减少了并发事务间的争用。
- 改进了刷新策略:提供了更好的 redo log 刷新控制,有助于提升高并发写操作的性能。
二、JSON 功能的巨大增强
-
JSON 数据类型增强
- 提供了更多操作 JSON 的内置函数,如
JSON_OBJECTAGG(),JSON_ARRAYAGG()用于聚合数据成 JSON 格式。 - 引入了
JSON_TABLE()函数,可以将 JSON 数据转换为关系表格式进行查询,实现了 JSON 和关系型数据之间的无缝转换。 - 增加了
JSON_PATH表达式,提升了 JSON 查询的性能和灵活性。 - 对 JSON 文档的部分更新(
JSON_MERGE_PATCH)效率更高。
- 提供了更多操作 JSON 的内置函数,如
-
JSON 文档验证
- 在插入和更新时,会自动验证 JSON 文档的格式是否正确,避免了无效 JSON 数据存入数据库。
三、SQL 功能与可用性改进
-
角色
- 引入了真正的数据库“角色”概念。可以创建角色,为角色分配权限,然后将角色授予给多个用户。这极大地简化了权限管理,特别是在用户众多、权限模型复杂的场景下。
-
新的字符集与排序规则
- 默认字符集从
latin1改为utf8mb4,更好地支持全球化和 emoji 表情符号。 - 默认的排序规则改为
utf8mb4_0900_ai_ci(基于 Unicode 9.0 标准,不区分重音和大小写),提供了更准确、更快速的字符串比较和排序。
- 默认字符集从
-
原子 DDL
- 如前所述,大多数 DDL 操作(
CREATE,ALTER,DROP等)现在是原子性的,保证了数据字典的一致性。
- 如前所述,大多数 DDL 操作(
-
不可见列
- 可以创建“不可见”的列。对于
SELECT *查询,该列不会被返回,必须显式指定列名才能查询到。适用于 schema 演进,可以在不影响现有应用的情况下增加新字段。
- 可以创建“不可见”的列。对于
-
资源组
- 允许将服务器线程绑定到特定的 CPU 上,并为线程设置优先级。这使 DBA 能够优化系统资源分配,确保关键任务获得更多 CPU 资源。
-
持久化全局变量
- 使用
SET PERSIST命令修改变量,改动会立即生效并且写入mysqld-auto.cnf配置文件,服务器重启后配置依然保留。避免了手动修改my.cnf文件容易出错的问题。
- 使用
四、安全性与账户管理
-
新的密码策略
- 默认的身份验证插件从
mysql_native_password改为更安全的caching_sha2_password。提供了更好的安全性,但可能在连接旧版本客户端时需要注意兼容性问题(需要更新客户端驱动或配置)。 - 支持密码有效期、密码重用限制、密码验证要求(修改密码需提供旧密码)等更严格的策略。
- 默认的身份验证插件从
-
动态权限
- 引入了更细粒度的“动态权限”,例如
APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,SYSTEM_VARIABLES_ADMIN等,实现了更精细的权限控制,不再需要授予超级用户权限。
- 引入了更细粒度的“动态权限”,例如
五、InnoDB 存储引擎增强
-
自增序列持久化
- 自增计数器(AUTO_INCREMENT)会在每次变化时写入 redo log,并在检查点刷盘。服务器重启后不会再出现重复使用旧值的情况(5.7 及之前重启后可能重用之前分配的值)。
-
死锁检测优化
- 改进了死锁检测机制,在高并发系统上性能更好。
-
表空间管理
- 支持
ALTER TABLESPACE ... RENAME TO重命名通用表空间。
- 支持
六、废弃和移除的功能
- 移除了查询缓存功能。由于在多核机器和高并发负载下,查询缓存的有效性很低且容易成为瓶颈,官方决定彻底移除它。
- 移除了
password()函数,使用更安全的认证方式。 - 废弃了部分加密函数,如
ENCODE(),DECODE(),推荐使用AES_ENCRYPT(),AES_DECRYPT()。
总结
| 特性类别 | MySQL 5.7 | MySQL 8.0 | 升级意义 |
|---|---|---|---|
| 数据字典 | 文件+MyISAM表 | InnoDB事务表 | 原子性DDL、崩溃安全、性能提升 |
| SQL能力 | 基础 | 窗口函数、CTE(含递归) | 复杂查询能力质的飞跃 |
| 索引 | 基础 | 隐藏索引、降序索引、函数索引 | DBA 优化和维护的利器,性能优化手段更多 |
| JSON | 基础支持 | 强大函数、部分更新、验证 | 文档模型处理能力显著增强 |
| 管理性 | 弱 | 角色、资源组、持久化变量 | DBA 管理效率和精细化程度大幅提升 |
| 安全性 | 传统 | 新密码插件、动态权限 | 默认更安全,权限控制更精细 |
| 性能基础 | 良好 | redo log优化、自增持久化 | 高并发场景下更稳定、性能更高 |
升级建议:
MySQL 8.0 在性能、功能和安全方面都带来了巨大收益,是新项目的绝对首选。对于现有从 5.7 迁移到 8.0,需要仔细进行兼容性测试,特别是:
- 检查是否使用了已移除或废弃的功能(如查询缓存)。
- 验证客户端驱动是否支持新的
caching_sha2_password认证插件。 - 对关键业务SQL进行性能测试,因为优化器有了很大改进,执行计划可能发生变化。
470

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



