MySQL 5.7 曾是使用最广泛的长期版本,许多公司至今仍运行在 5.7 上。而 MySQL 8.0 作为重大更新,在性能、功能、安全性方面有了质的飞跃。理解两者的核心差异,能帮助你在项目选型、版本升级时做出更明智的决策。
1.4.1 数据字典与系统架构变化
MySQL 5.7:数据字典分散存储在系统表(如 mysql.* 表)和各个数据库目录下的 .frm 文件中,部分元数据重复存储,容易出现不一致。
MySQL 8.0:引入了事务性数据字典,将所有元数据(表结构、索引、约束等)集中存储在 InnoDB 引擎的 mysql.ibd 表空间中,并支持原子 DDL。这意味着 CREATE TABLE、ALTER TABLE 等操作要么全部成功,要么全部回滚,不会再出现“表结构改了但字典没更新”的半成品状态,升级稳定性大幅提升。
1.4.2 SQL 特性大幅扩展
窗口函数与公用表表达式 (CTE):这是 8.0 最实用的 SQL 增强。
- 窗口函数(
ROW_NUMBER(),RANK(),LEAD(),LAG()等):让你在查询结果集内进行排名、移动计算,无需繁琐的自连接或子查询。在报表、分页去重场景中非常顺手。 - CTE (
WITH子句):支持递归查询,让树形数据(如组织架构、评论嵌套)的遍历变得简单直观,替代 5.7 中原始的递归存储过程写法。
此外,8.0 还增加了 INTERSECT、EXCEPT 集合操作、DESC 降序索引、函数索引(表达式索引)、JSON_TABLE() 等,使分析类和半结构化数据的处理能力显著增强。
1.4.3 索引与优化器改进
- 隐藏索引:可将索引标记为 “不可见”,优化器会忽略它。用于安全地测试删除索引的性能影响,确认无用后再真正删除。在 5.7 中删索引只能靠经验或停机。
- 直方图统计:优化器能了解列值分布,更准确地估算范围和等值条件的行数,告别“数据分布倾斜导致误选索引”的问题。5.7 依赖的
index dive在数据量超大时可能不准。 - 索引跳跃扫描 (Skip Scan):优化器可在某些条件下有效利用联合索引的第二列,即使第一列未在条件中出现,这是 8.0.13 引入的。
- 支持降序索引:8.0 可以创建真正的降序索引,加速
ORDER BY col DESC的查询,5.7 的降序索引会被忽略。
1.4.4 字符集与排序规则统一
MySQL 5.7:默认字符集是 latin1,默认排序规则是 latin1_swedish_ci。创建表时如果不小心就容易设错,导致中文乱码,或者排序结果不符合预期。
MySQL 8.0:默认字符集改为 utf8mb4,默认排序规则为 utf8mb4_0900_ai_ci。utf8mb4 才是真正的 UTF-8,支持所有 Unicode 字符(包括表情符号),避免了之前使用 utf8mb3 (或误写为 utf8)带来的截断问题。这一改变对中文项目极其友好,基本杜绝了默认乱码问题。
1.4.5 安全与权限管理增强
- 新的认证插件:8.0 默认改用了
caching_sha2_password,替代 5.7 的mysql_native_password,安全强度更高,但老版本客户端连接时可能会报错,需要调整兼容设置。 - 角色的引入:8.0 支持数据库角色,可以创建一组权限集合,然后授予多个用户,简化权限管理。5.7 必须逐个用户分配权限。
- 密码管理策略:8.0 支持限制密码重试次数、失效时间、历史密码检查等策略,便于满足安全合规要求。
- 更细的权限:增加了
SYSTEM_VARIABLES_ADMIN、SESSION_VARIABLES_ADMIN等动态权限,让管理更精细。
1.4.6 InnoDB 存储引擎增强
- 原子 DDL:已提过,由 InnoDB 原子化日志保障,避免中途故障导致数据字典损坏。
- NoSQL 风格文档存储:8.0 支持将 MySQL 作为文档数据库使用,通过 X DevAPI 操作 JSON 集合,提供 CRUD 接口,且支持
JSON_TABLE将 JSON 虚拟成关系表。 - 更好的 DDL 在线操作:8.0 支持
ALGORITHM=INSTANT添加列,真正瞬间完成,避免了大型表添加列导致长时间锁表的问题。 - 缓冲池改进:支持多个缓冲池实例,减少并发竞争;自适应哈希索引分区,减少锁争用。
- 自增主键持久化:8.0 重启后自增值不会重置,5.7 重启后会重置为
MAX(id)+1,在历史数据删除后可能产生键值冲突。
1.4.7 复制与高可用演进
- 默认复制方式:8.0 开始,基于 GTID 的复制逐步成为标配,管理更简单,故障切换更方便。
- 组复制 (Group Replication):8.0 中 MGR 成熟度大幅提升,支持多主模式,可实现自动故障检测和选主,为构建分布式高可用集群提供原生方案。
- 并行复制增强:8.0 支持基于 WRITESET 的并行复制,从库回放效率更高,可有效降低主从延迟。
1.4.8 实用工具与函数变化
EXPLAIN ANALYZE(8.0.18):直接在查询时输出实际执行时间,而不只是估算,便于定位慢查询真正耗时在哪个操作上。- *
DOUBLE COUNT() 加速*:8.0 对COUNT() 做了优化,无 WHERE 条件的COUNT(*)直接返回缓存统计数据。 JSON函数扩展:新增JSON_ARRAYAGG(),JSON_OBJECTAGG()等聚合函数,处理 JSON 更灵活。- 正则表达式增强:改用 ICU 库,支持更完整的正则语法。
1.4.9 升级注意事项
- SQL 兼容性测试:8.0 中部分系统关键字(如
rank,groups)被保留,5.7 中合法的表名可能在 8.0 出现语法错误,需用反引号包裹。 - 默认认证插件导致连接失败:老版本客户端连接 8.0 可能报
Authentication plugin 'caching_sha2_password'错误,可在全局设置default_authentication_plugin=mysql_native_password,或升级客户端驱动。 - UTF8 排序规则的细微差异:
utf8mb4_0900_ai_ci排序行为与 5.7 的utf8mb4_general_ci略有不同,涉及字符类型的唯一索引,可能因此产生重复键错误,升级前需充分验证。 - Group By 严格模式:8.0 默认开启了
ONLY_FULL_GROUP_BY,5.7 中跑通的非标准 GROUP BY 查询可能在 8.0 直接报错,需修改 SQL。 - 存储引擎限制:8.0 不再支持 MyISAM 的一些过时功能(如多表更新),需要改用 InnoDB。
总结:对于新项目,强烈建议直接使用 MySQL 8.0,享受其现代 SQL 特性、安全性提升和更好的性能。对于存量 5.7 系统,升级前需要充分测试,并用 mysqlshell 的 checkForServerUpgrade 工具提前排查问题。两者的差距不是简单的版本号变动,而是一次现代化的蜕变。