RSS
菜单
全部文章快讯开发科技深度热点

第 84 章 5.7vs8.0差异问答速查

内容摘要

MySQL 5.7 到 8.0 是一次大版本升级,面试中经常被问"你用过 5.7 还是 8.0,知道有什么区别吗"。本篇用"差异表格 + 问答"形式整理两版本在语法、架构、参数、复制、升级上的高频差异。本文基于 MySQL 8.0,对比对象为 5.7。

📖 本篇简介:MySQL 5.7 到 8.0 是一次大版本升级,面试中经常被问"你用过 5.7 还是 8.0,知道有什么区别吗"。本篇用"差异表格 + 问答"形式整理两版本在语法、架构、参数、复制、升级上的高频差异。本文基于 MySQL 8.0,对比对象为 5.7。

目录

  • 1 使用说明
  • 2 版本概览对比表
  • 3 完整差异速查表
  • 4 语法与SQL差异问答
  • 5 架构与参数差异问答
  • 6 复制与高可用差异问答
  • 7 升级注意事项问答
  • 8 8.0新特性实战案例
  • 9 常见误区澄清
  • 10 自测练习

1 使用说明

5.7 和 8.0 的差异题,考的不是"背新特性列表",而是"你有没有真正用过 8.0"。面试官问"8.0 比 5.7 好在哪",你答出两三个真正用过的特性,比背十条八股文强。

阅读方法:先看"差异表格"建立全局,再看"问答"理解细节。下面按主题分组,每组先给差异表,再给面试问答。

| 对比维度 | 重点 |

|---|---|

| 语法 | CTE、窗口函数、隐藏索引 |

| 架构 | 数据字典、redo、原子 DDL |

| 参数 | 默认值变化、删除查询缓存 |

| 复制 | GTID 默认、并行回放 |

| 升级 | 兼容性、回滚 |

2 版本概览对比表

先给一张全局对比表,让你一眼看到大方向。

| 对比项 | MySQL 5.7 | MySQL 8.0 |

|---|---|---|

| 发布时间 | 2015 年 | 2018 年 GA |

| 数据字典 | frm 文件存元数据 | InnoDB 内部事务化 |

| 查询缓存 | 有(默认关) | 彻底删除 |

| CTE | 不支持 | 支持 WITH |

| 窗口函数 | 不支持 | 支持 |

| 隐藏索引 | 不支持 | 支持 invisible index |

| 降序索引 | 语法忽略 | 真正降序存储 |

| 原子 DDL | 不支持 | 支持 |

| 持久化统计信息 | 可选 | 默认开启 |

| GTID | 可选开 | 推荐开 |

| 角色权限 | 简单 | 支持 role |

| 密码插件 | mysql_native_password | caching_sha2_password 默认 |

| redo log | 固定 2 个文件 | 可动态调整 |

| 自增持久化 | 重启后不记忆 | 重启后持久化 |

| group by | 默认隐式排序 | 不再隐式排序 |

| utf8 | utf8mb3 | utf8mb4 真正 4 字节 |

| JSON | 基础支持 | 增强,JSON_TABLE |

| 哈希连接 | 不支持 | 支持 hash join |

| 并行查询 | 不支持 | 8.0.14 后有限支持 |

3 完整差异速查表

这张表把 5.7 和 8.0 的所有差异点浓缩成 30 行,面试前扫一遍。

| 差异点 | 5.7 | 8.0 |

|---|---|---|

| 数据字典 | frm 文件 | InnoDB 内部事务化 |

| 查询缓存 | 有 | 删除 |

| CTE | 不支持 | 支持 |

| 窗口函数 | 不支持 | 支持 |

| 隐藏索引 | 不支持 | 支持 |

| 降序索引 | 语法忽略 | 真正降序 |

| 原子 DDL | 不支持 | 支持 |

| GROUP BY | 隐式排序 | 不隐式排序 |

| 自增值 | 内存,重启跳变 | 持久化 |

| 默认密码插件 | mysql_native_password | caching_sha2_password |

| GTID | 可选 | 推荐默认 |

| 并行回放 | 有限 | LOGICAL_CLOCK 默认 |

| 角色权限 | 简单 | 支持 role |

| 直方图 | 无 | 有 |

| 哈希连接 | 无 | 有 |

| redo log | 固定大小 | 可在线调 |

| binlog 过期 | expire_logs_days | binlog_expire_logs_seconds |

| utf8 | utf8mb3 | utf8mb4 默认推荐 |

| 持久化统计 | 可选 | 默认开 |

| 保留字 | 少 | 新增 ROW 等 |

| DDL 原子性 | 非原子 | 原子 |

| information_schema | 慢 | 查数据字典更快 |

| 默认端口 | 3306 | 3306(不变) |

| 默认隔离级别 | RR | RR(不变) |

| 存储过程 | 支持 | 支持 |

| 触发器 | 支持 | 支持 |

| 事件调度器 | 支持 | 支持 |

| JSON | 基础 | JSON_TABLE |

| 降序索引 | 忽略 | 生效 |

| 后台线程 | 较少 | 更多并行 |

4 语法与SQL差异问答

Q1:8.0 新增了哪些 SQL 语法?

答:最常用的是 CTE(WITH 子句)和窗口函数(ROW_NUMBER/RANK/LAG/SUM OVER)。以前要嵌套子查询才能写的"每组 TopN""连续登录"题,8.0 用窗口函数一两行搞定。

-- 8.0 窗口函数:每组 Top3(本示例基于 MySQL 8.0)
SELECT dept, emp, salary
FROM (
  SELECT dept, emp, salary,
         ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) rn
  FROM emp
) t WHERE rn <= 3;

Q2:8.0 的 GROUP BY 还隐式排序吗?

答:不隐式排序了。5.7 里 GROUP BY a 会默认按 a 排序,8.0 去掉了这个隐式行为,需要排序必须显式 ORDER BY。这是升级时容易踩的坑:升级后同样的 SQL 返回顺序变了。

Q3:什么是隐藏索引?

答:8.0 新增 invisible index,索引存在但优化器不使用。用来做"软删除索引"——先标记隐藏观察几天,没影响再真删,避免误删。

-- 把某个索引设为隐藏(本示例基于 MySQL 8.0)
ALTER TABLE orders ALTER INDEX idx_user_id INVISIBLE;
-- 观察一段时间确认无影响后再真删
DROP INDEX idx_user_id ON orders;

Q4:utf8 和 utf8mb4 有什么区别?

答:5.7 里 utf8 其实是 utf8mb3,最多 3 字节,存不下 emoji。8.0 默认推荐 utf8mb4,真正 4 字节,能存 emoji 和生僻字。升级时字符集要统一成 utf8mb4。

5 架构与参数差异问答

Q5:8.0 的数据字典有什么变化?

答:5.7 用 .frm 文件存表结构,非事务化,crash 可能损坏。8.0 把元数据全部放进 InnoDB 内部表空间,事务化管理,崩溃一致性好,information_schema 查询也更快。

Q6:什么是原子 DDL?

答:8.0 的 DDL 操作(如 CREATE/DROP TABLE)现在是事务化的,要么全成功要么全回滚,不会出现"改了一半崩了"。5.7 里 DDL 中途失败可能残留中间状态。

Q7:查询缓存为什么删了?

答:5.7 的 query cache 在高并发下锁竞争严重,命中率也不高,8.0 直接删除。面试答"8.0 没有查询缓存了"即可。

Q8:自增 ID 重启后为什么会跳变?

答:5.7 的自增值只存在内存,重启后取 MAX(id)+1,导致"重启后跳号"。8.0 把自增值持久化到 redo log,重启后记住原来的值,不再跳变。

Q9:8.0 默认密码插件变了吗?

答:变了。8.0 默认用 caching_sha2_password,比老的 mysql_native_password 更安全。但老客户端连不上,升级时要注意驱动版本。

6 复制与高可用差异问答

Q10:8.0 的 GTID 复制有什么改进?

答:8.0 推荐默认开 GTID,gtid_mode=ON 配合 enforce_gtid_consistency。切换从库时不用再记 binlog 文件名和位置,靠 GTID 自动对齐,运维简单很多。

-- 8.0 基于 GTID 的从库配置(本示例基于 MySQL 8.0)
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='主库IP',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='xxx',
  SOURCE_AUTO_POSITION=1;   -- 自动靠 GTID 定位

Q11:从库并行回放有什么改进?

答:8.0 默认 replica_parallel_type=LOGICAL_CLOCK,配合 slave_parallel_workers,从库多线程回放,延迟比 5.7 单线程小很多。还支持 WRITESET 模式,按行哈希并行。

Q12:binlog 默认格式变了吗?

答:8.0 默认 binlog_format=ROW,和 5.7 一致。但 8.0 的 binlog_expire_logs_seconds 取代了老的 expire_logs_days,按秒管理更精确。

Q13:8.0 的 redo log 有什么变化?

答:8.0 之前 redo log 文件个数和大小在启动时固定,改了要改配置重启。8.0 支持在线调整 redo log 大小,运维更灵活。

Q14:8.0 角色权限有什么改进?

答:8.0 支持 CREATE ROLE,可以把一组权限打包成角色,再授给用户,权限管理更清晰。5.7 只能逐用户授权。

-- 8.0 角色权限用法(本示例基于 MySQL 8.0)
CREATE ROLE 'app_read', 'app_write';        -- 建角色
GRANT SELECT ON db.* TO 'app_read';         -- 给角色授权限
GRANT app_read TO 'user1'@'%';              -- 把角色授给用户
SET DEFAULT ROLE ALL TO 'user1'@'%';        -- 用户登录默认带角色

Q15:8.0 的直方图有什么用?

答:8.0 新增列直方图统计信息,对数据分布不均匀的列,优化器能更准确估算行数,选对执行计划。5.7 只有索引基数统计。

Q16:8.0 的哈希连接是什么?

答:8.0.18 后新增 hash join,用于没有索引的等值 JOIN,用内存哈希表替代嵌套循环,性能更好。5.7 无索引 JOIN 只能嵌套循环。

Q17:8.0 的备份工具有什么变化?

答:8.0 官方推荐用 MySQL Shell 的 util 做实例导出导入,mysqldump 还在但更适合小数据。XtraBackup 等第三方工具也要对应升级。

7 升级注意事项问答

Q13:从 5.7 升级到 8.0 要注意什么?

答:主要有这几个坑:

  • 密码插件变了,老客户端要升级驱动;
  • GROUP BY 不再隐式排序,业务依赖顺序的要加 ORDER BY;
  • utf8 要统一成 utf8mb4;
  • 删除了 query cache,依赖它的业务要改造;
  • 保留字变了(如 ROW),老 SQL 可能撞保留字。

Q14:升级方式有哪些?

答:大版本升级官方推荐用 MySQL Shell 的 upgrade 命令原地升级,或者用主从搭建新 8.0 集群再切流量。不建议直接 jump。

| 升级方式 | 风险 | 适用 |

|---|---|---|

| 原地升级 | 中,需停机 | 小业务 |

| 主从切换 | 低,灰度 | 大业务推荐 |

| 导出导入 | 高,慢 | 数据量小 |

Q15:升级前要做哪些兼容性检查?

答:下面这张清单是升级前必须过一遍的。

| 检查项 | 命令/做法 |

|---|---|

| 保留字冲突 | 跑 mysqlshell 的 check 脚本 |

| 密码插件 | 确认客户端驱动支持 sha2 |

| GROUP BY 排序 | 业务依赖顺序的 SQL 加 ORDER BY |

| 字符集 | 全部统一成 utf8mb4 |

| 废弃参数 | 检查 my.cnf 里 8.0 删除的参数 |

| 查询缓存依赖 | 业务代码是否用到 SQL_CACHE |

| 外键约束 | 8.0 默认行为变化检查 |

| 时区设置 | 确认时区一致 |

| 存储过程 | 8.0 语法兼容性测试 |

| 触发器 | 兼容性测试 |

Q16:升级失败怎么回滚?

答:主从切换方案最安全:新 8.0 集群作为从库追着 5.7 主库,切流量前一直同步。万一出问题切回 5.7 主库即可,数据不丢。原地升级风险高,要先全量备份。

Q17:升级对性能有什么影响?

答:8.0 默认配置下性能不一定比 5.7 好,甚至要重新调优。但优化器更智能,窗口函数减少了临时表,高并发下整体更稳。下面这张表是升级后常见的性能变化。

| 场景 | 升级后变化 | 应对 |

|---|---|---|

| 大表 GROUP BY | 不再隐式排序,可能变快 | 显式 ORDER BY |

| 复杂子查询 | CTE 改写后更快 | 主动改写 |

| 等值 JOIN | hash join 可能更快 | 观察执行计划 |

| 写入 | redo 可在线调,更灵活 | 重新调优 |

| 内存 | 数据字典占少量内存 | 观察 RSS |

| 启动 | 数据字典加载稍慢 | 预热缓冲池 |

| 备份 | 官方工具变了 | 迁移备份脚本 |

| 监控 | 部分状态变量改名 | 改监控脚本 |

Q18:8.0 还支持 MyISAM 吗?

答:还支持,但官方不推荐新业务用。系统表已经从 MyISAM 迁到 InnoDB。MyISAM 不支持事务和行锁,新项目一律 InnoDB。

Q19:8.0 的 DDL 为什么变快了?

答:8.0 的很多 DDL(如加列、加索引)支持 Instant 算法,不需要重建整表,瞬间完成。5.7 的加列要 copy 全表,大表要锁很久。

Q20:8.0 的 JSON 类型有什么增强?

答:8.0 新增 JSON_TABLE 把 JSON 转成关系表查询,路径表达式更完善。JSON 类型在 8.0 里已经能当半结构化数据库用。

-- 8.0 JSON_TABLE 用法(本示例基于 MySQL 8.0)
SELECT jt.*
FROM orders,
JSON_TABLE(order_json, '$[*]' COLUMNS (
  item VARCHAR(50) PATH '$.name',
  qty  INT        PATH '$.qty'
)) AS jt;

8 8.0新特性实战案例

光说差异不够,面试官想知道你实际用过没。下面给出三个最常用的 8.0 特性实战写法。

案例一:窗口函数解决 TopN

-- 每个部门工资 Top3(本示例基于 MySQL 8.0)
-- 5.7 要写嵌套子查询,8.0 一行 ROW_NUMBER 搞定
SELECT dept, emp, salary FROM (
  SELECT dept, emp, salary,
         ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) rn
  FROM emp
) t WHERE rn <= 3;

案例二:隐藏索引做灰度删索引

-- 软删索引观察(本示例基于 MySQL 8.0)
ALTER TABLE orders ALTER INDEX idx_user_id INVISIBLE;  -- 先隐藏
-- 观察一周慢日志,没影响再真删
DROP INDEX idx_user_id ON orders;
-- 有影响立刻恢复
ALTER TABLE orders ALTER INDEX idx_user_id VISIBLE;

案例三:CTE 复用中间结果

-- CTE 写法(本示例基于 MySQL 8.0)
WITH recent_order AS (
  SELECT user_id, MAX(id) AS max_id FROM orders GROUP BY user_id
)
SELECT u.name, ro.max_id, o.amount
FROM users u
JOIN recent_order ro ON ro.user_id = u.user_id
JOIN orders o ON o.id = ro.max_id;

9 常见误区澄清

| 误区 | 真相 |

|---|---|

| 8.0 就是快 | 不一定,默认配置下 8.0 要重新调优 |

| 8.0 不支持 5.7 语法 | 大部分兼容,少数保留字冲突 |

| 升 8.0 必须重做参数 | 大部分参数名不变,少量改名 |

| 8.0 取消了 binlog | 没有,binlog 是复制根基 |

| 窗口函数替代所有子查询 | 复杂场景还是要 CTE 配合 |

| 8.0 自动优化一切 | 优化器变聪明但 SQL 烂还是慢 |

| 8.0 不能用 MyISAM | 还能用,但不推荐 |

| 8.0 默认 utf8mb4 | 是的,但建库要显式指定 |

| 8.0 删除了存储过程 | 没有,还支持 |

| 8.0 升级后立即快 | 要重新调优参数 |

| 8.0 GTID 必须开 | 推荐开,但可以不开 |

| 8.0 并行回放默认开 | 默认 LOGICAL_CLOCK |

| 8.0 不支持外键 | 还支持 |

| 8.0 删除了触发器 | 还支持 |

| 8.0 备份工具变了 | mysqldump 还在,推荐 mysqlshell |

| 8.0 密码插件不变 | 变了,默认 sha2 |

| 8.0 端口变了 | 还是 3306 |

| 8.0 隔离级别变了 | 还是 RR |

| 8.0 不支持主从 | 还支持,更好 |

| 8.0 不能降级 | 不能降级,只能备份恢复 |

10 自测练习

自测 1:8.0 删除了什么老功能?

<details>

<summary>参考答案</summary>

查询缓存(query cache)。高并发下锁竞争严重,命中率低,8.0 直接移除。

</details>

自测 2:8.0 的 GROUP BY 和 5.7 有什么区别?

<details>

<summary>参考答案</summary>

5.7 的 GROUP BY 会隐式按分组列排序,8.0 去掉了这个隐式行为。升级后同样的 SQL 返回顺序可能不同,需要排序必须显式 ORDER BY。

</details>

自测 3:什么是原子 DDL?

<details>

<summary>参考答案</summary>

8.0 的 DDL 操作是事务化的,要么全成功要么全回滚,不会出现中途失败残留中间状态。5.7 里 DDL 失败可能留下半成品。

</details>

自测 4:8.0 默认密码插件是什么?有什么影响?

<details>

<summary>参考答案</summary>

caching_sha2_password,比老的 mysql_native_password 更安全。但老版本客户端和驱动连不上,升级时要同步升级 JDBC/驱动版本。

</details>

自测 5:自增 ID 重启跳变问题 8.0 解决了吗?

<details>

<summary>参考答案</summary>

解决了。5.7 自增值只存内存,重启后取 MAX(id)+1 导致跳号。8.0 把自增值持久化到 redo log,重启后记住原来的值。

</details>

自测 6:8.0 默认字符集是什么?为什么?

<details>

<summary>参考答案</summary>

8.0 默认推荐 utf8mb4。5.7 里的 utf8 其实是 utf8mb3,最多 3 字节,存不下 emoji。utf8mb4 真正 4 字节,能存 emoji 和生僻字。生产环境统一用 utf8mb4。

</details>

自测 7:什么是隐藏索引?怎么用?

<details>

<summary>参考答案</summary>

8.0 新增 invisible index,索引存在但优化器不用。用来做"软删除索引"——先 ALTER INDEX ... INVISIBLE 观察几天,没影响再真 DROP。避免误删索引导致 SQL 突然变慢。

</details>

自测 8:8.0 的统计信息有什么改进?

<details>

<summary>参考答案</summary>

8.0 持久化统计信息到磁盘,重启不丢失;新增列直方图,对数据分布不均匀的列,优化器能更准确估算行数,选对执行计划。

</details>

自测 9:从 5.7 升 8.0,业务代码要注意什么?

<details>

<summary>参考答案</summary>

  • GROUP BY 不再隐式排序,依赖顺序的 SQL 加 ORDER BY;
  • 保留字变了,老 SQL 可能撞 ROW 等新关键字;
  • 密码插件变了,老驱动要升级;
  • 查询缓存没了,别用 SQL_CACHE。

</details>

自测 10:8.0 的 information_schema 为什么更快?

<details>

<summary>参考答案</summary>

5.7 的 information_schema 要遍历 frm 文件,慢。8.0 把元数据存在 InnoDB 内部表,查数据字典直接走索引,快很多。

</details>

自测 11:8.0 还能从 5.7 直接主从同步吗?

<details>

<summary>参考答案</summary>

可以做升级迁移的过渡:8.0 从库挂在 5.7 主库下追数据,追平后切流量。但要注意字符集、保留字兼容性。

</details>

练习 1:列出你在项目中实际用过的 3 个 8.0 新特性,并说明带来了什么收益。

练习 2:如果公司要从 5.7 升 8.0,你会怎么制定升级方案?

5.7 vs 8.0 的差异题,面试官其实是想看你"有没有真正用过新版本"。能说出一两个实际踩过的坑(比如 GROUP BY 不再排序),比背新特性列表更可信。

面试答题模板:先说"8.0 相比 5.7 主要是三块变化:语法层加了窗口函数和 CTE,架构层数据字典事务化和原子 DDL,运维层 GTID 默认和并行回放"。这样有结构、有细节,面试官会觉得你真用过。

10.1 差异补充

| 差异 | 5.7 | 8.0 |

|---|---|---|

| CTE | 无 | 有 |

| 窗口函数 | 无 | 有 |

| 隐藏索引 | 无 | 有 |

| 降序索引 | 忽略 | 生效 |

| 原子 DDL | 无 | 有 |

| 自增持久化 | 无 | 有 |

| 查询缓存 | 有 | 删除 |

| 数据字典 | frm | 内部表 |

| 默认密码 | native | sha2 |

| GROUP BY | 隐式排序 | 不排序 |

10.2 差异补充

| 差异 | 5.7 | 8.0 |

|---|---|---|

| CTE | 无 | 有 |

| 窗口函数 | 无 | 有 |

| 隐藏索引 | 无 | 有 |

| 降序索引 | 忽略 | 生效 |

| 原子 DDL | 无 | 有 |

| 自增持久化 | 无 | 有 |

| 查询缓存 | 有 | 删除 |

| 数据字典 | frm | 内部 |

10.3 收尾

差异题重点是真用过。

| 检查项 | 是/否 |

|---|---|

| 用过窗口函数 | |

| 用过隐藏索引 | |

| 升过级 | |

10.4 结尾

差异速查到此结束,重点是真用过。

下一篇预告:第 85 章 冷门加分面试题20题

— 全文完 —回到顶部 ↑
下载推广海报

文章推广海报

《第 84 章 5.7vs8.0差异问答速查》完整推广海报
DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。