MySQL 5.7与8.0版本区别详解
·
1. 性能改进
1.1 窗口函数(Window Functions)
- MySQL 8.0:
- 支持窗口函数,如
ROW_NUMBER()、RANK()、DENSE_RANK()、LEAD()、LAG()等。 - 示例:
SELECT id, value, ROW_NUMBER() OVER (PARTITION BY category ORDER BY value DESC) AS rank FROM my_table; - 窗口函数可以简化复杂查询,避免多层嵌套子查询。
- 支持窗口函数,如
- MySQL 5.7:
- 不支持窗口函数,需通过子查询或复杂 JOIN 实现类似功能。
1.2 通用表表达式(CTE)
- MySQL 8.0:
- 支持递归和非递归的通用表表达式(CTE)。
- 示例:
WITH RECURSIVE cte AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM cte WHERE n < 10 ) SELECT * FROM cte; - CTE 提高复杂查询的可读性和维护性。
- MySQL 5.7:
- 不支持 CTE。
1.3 索引优化
- MySQL 8.0:
- 支持 隐藏索引(Invisible Indexes),可以临时禁用索引而不删除。
ALTER TABLE my_table ALTER INDEX idx_name INVISIBLE; - 支持 降序索引(Descending Indexes),优化
ORDER BY column DESC查询。CREATE INDEX idx_name ON my_table (column DESC);
- 支持 隐藏索引(Invisible Indexes),可以临时禁用索引而不删除。
- MySQL 5.7:
- 不支持隐藏索引和降序索引。
2. JSON 功能增强
2.1 JSON 操作符和函数
- MySQL 8.0:
- 新增 JSON 操作符
->>,替代JSON_UNQUOTE(JSON_EXTRACT())。SELECT json_column->>'$.key' FROM my_table; - 支持 JSON 路径表达式(
JSON_PATH),增强 JSON 数据查询能力。 - 新增函数:
JSON_TABLE():将 JSON 数据转换为表格形式。JSON_MERGE_PATCH():合并 JSON 文档。JSON_STORAGE_SIZE():返回 JSON 数据的存储大小。
- 新增 JSON 操作符
- MySQL 5.7:
- JSON 功能较为基础,仅支持
JSON_EXTRACT()、JSON_ARRAY()、JSON_OBJECT()等。
- JSON 功能较为基础,仅支持
3. 安全性改进
3.1 默认身份验证插件
- MySQL 8.0:
- 默认使用
caching_sha2_password插件,提供更强的密码加密。 - 注意:旧客户端可能不兼容,需升级或显式修改插件:
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
- 默认使用
- MySQL 5.7:
- 默认使用
mysql_native_password插件。
- 默认使用
3.2 角色管理
- MySQL 8.0:
- 支持角色(Roles),简化权限管理。
CREATE ROLE 'read_only'; GRANT SELECT ON db.* TO 'read_only'; GRANT 'read_only' TO 'user'@'host';
- 支持角色(Roles),简化权限管理。
- MySQL 5.7:
- 需手动分配权限,无角色支持。
3.3 密码策略
- MySQL 8.0:
- 支持密码过期策略、密码复用限制、密码强度检查等。
SET GLOBAL validate_password.policy = STRONG;
- 支持密码过期策略、密码复用限制、密码强度检查等。
- MySQL 5.7:
- 需通过插件实现部分功能。
4. 数据字典
- MySQL 8.0:
- 重构数据字典,将系统表(如
information_schema)存储在 InnoDB 引擎中。 - 支持 原子 DDL 操作(Atomic DDL),DDL 操作要么完全成功,要么回滚。
- 重构数据字典,将系统表(如
- MySQL 5.7:
- 数据字典存储在 MyISAM 表中,不支持原子 DDL。
5. 字符集与编码
- MySQL 8.0:
- 默认字符集从
latin1改为utf8mb4,全面支持 Unicode(包括表情符号)。 - 支持
utf8mb4_0900_ai_ci校对规则,提供更准确的排序和比较。
- 默认字符集从
- MySQL 5.7:
- 默认字符集为
latin1,需手动修改为utf8mb4。
- 默认字符集为
6. 资源管理
- MySQL 8.0:
- 支持资源组(Resource Groups),可限制 CPU 和线程优先级。
CREATE RESOURCE GROUP my_group TYPE = USER VCPU = 0-1 THREAD_PRIORITY = 5; SET RESOURCE GROUP my_group FOR thread_id;
- 支持资源组(Resource Groups),可限制 CPU 和线程优先级。
- MySQL 5.7:
- 无此功能。
7. InnoDB 改进
- MySQL 8.0:
- 支持 原子 DDL(Atomic DDL),DDL 操作要么完全成功,要么回滚。
- 自增列(AUTO_INCREMENT)持久化,重启后不会重置。
- 支持并行构建全文索引。
- MySQL 5.7:
- 不支持原子 DDL 和自增列持久化。
8. 配置参数变化
- MySQL 8.0:
- 移除或弃用部分旧参数(如
query_cache_type、innodb_file_format)。 - 新增参数(如
innodb_dedicated_server自动配置 InnoDB 内存)。
- 移除或弃用部分旧参数(如
- MySQL 5.7:
- 使用旧参数,需手动调优。
9. 备份与恢复
- MySQL 8.0:
- 支持 备份锁(Backup Lock),允许在线备份期间执行 DML 操作(仅阻塞 DDL)。
LOCK INSTANCE FOR BACKUP; UNLOCK INSTANCE;
- 支持 备份锁(Backup Lock),允许在线备份期间执行 DML 操作(仅阻塞 DDL)。
- MySQL 5.7:
- 无备份锁功能。
10. 移除的功能
- MySQL 8.0:
- 移除
Query Cache(查询缓存),因多核扩展性问题。 - 移除
password()函数,改用SHA2加密。
- 移除
- MySQL 5.7:
- 支持
Query Cache和password()函数。
- 支持
11. 性能模式(Performance Schema)
- MySQL 8.0:
- 增强性能模式,支持更多监控指标(如事务、锁、内存使用等)。
- MySQL 5.7:
- 性能模式功能较少。
12. 优化器改进
- MySQL 8.0:
- 支持 直方图统计(Histogram Statistics),提升复杂查询的执行计划选择。
- 支持 跳过索引扫描(Skip Scan Index Access)。
- MySQL 5.7:
- 不支持直方图和跳过索引扫描。
13. 复制与高可用
- MySQL 8.0:
- 增强 Group Replication(组复制)的性能和稳定性。
- 支持 并行复制(基于 WriteSet 的多线程复制)。
- 默认启用二进制日志的校验和(
binlog_checksum=CRC32)。
- MySQL 5.7:
- 并行复制功能较弱。
14. 事务与隔离级别
- MySQL 8.0:
- 默认事务隔离级别为
REPEATABLE READ(与 5.7 一致)。 - 支持
NOWAIT和SKIP LOCKED选项,优化锁竞争场景。SELECT * FROM my_table FOR UPDATE NOWAIT;
- 默认事务隔离级别为
- MySQL 5.7:
- 不支持
NOWAIT和SKIP LOCKED。
- 不支持
15. 版本支持
- MySQL 5.7:
- 已于 2023 年 10 月结束标准支持,进入扩展支持阶段。
- MySQL 8.0:
- 是当前推荐版本,持续获得功能更新和安全补丁。
升级注意事项
- 兼容性问题:
- 检查客户端是否支持
caching_sha2_password。 - 确保应用代码兼容 MySQL 8.0 的关键字和保留字变化(如
RANK、SYSTEM)。
- 检查客户端是否支持
- 性能调优:
- 由于数据字典和优化器的改进,需重新评估执行计划。
- 备份与测试:
- 升级前务必备份数据,并在测试环境验证。
总结
MySQL 8.0 在性能、安全性、功能扩展性方面均有显著提升,建议新项目直接使用 8.0 版本。对于现有 5.7 系统,需根据业务需求评估升级成本和收益,确保兼容性和稳定性。
更多推荐



所有评论(0)