本节摘要:MySQL 的主线从 5.x 的普及时代走到 8.0 的现代化重写。8.0 带来事务性数据字典、CTE 与窗口函数、原子 DDL、降序索引等实打实的改进。本节按"对日常开发的影响"梳理版本史与升级注意。
窗口函数与 CTE,报表类 SQL 少写一半自连接:
-- 每个用户最近三笔订单,5.7 时代要写嵌套子查询 WITH recent AS ( SELECT user_id, order_id, amount, created_at, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) rn FROM clinic_order ) SELECT * FROM recent WHERE rn <= 3;
原子 DDL:建表、加索引要么成功要么回滚,不再留下半成品 frm 文件需要手工清理。
降序索引真正生效:
-- 8.0 里这个索引真的按降序存了 CREATE INDEX idx_created_desc ON clinic_order (created_at DESC);
数据字典进 InnoDB:表结构本身成了事务性数据,DDL 崩溃可恢复,也顺便干掉了 frm 文件的并发问题。升级前必做的检查:废弃特性(如老密码插件)、字符集统一到 utf8mb4、第三方工具对新字典的兼容性。

⚠️ 常见坑:从 5.7 直接跳到最新 8.0 小版本,忘了跑升级检查器。老库里的废弃 SQL 模式、共享表空间、旧字符集,任何一项都可能让升级过程卡在半路。
降序索引在 8.0 之前只是语法糖(写 DESC 仍按升序存),8.0 真正生效。它的用武之地是混合排序:按用户升序、按时间倒序取每组最新记录这类查询,5.7 要么 filesort 要么反向扫描,8.0 一棵 (user_id ASC, created_at DESC) 索引直取。不可见索引则是变更管理的安全网:把索引设为不可见,优化器立刻当它不存在,观察一周无回归再真正删除,比直接 DROP 多一个后悔按钮:
ALTER TABLE clinic_order ALTER INDEX idx_user_created SET INVISIBLE; -- 观察期后确认无用,再删除 ALTER TABLE clinic_order DROP INDEX idx_user_created;
5.7 到 8.0 的升级按四步走。第一步跑官方升级检查器,它会扫出废弃特性、保留字冲突(8.0 新增了一批保留字,老表列名撞车会直接建不出视图)、字符集问题。第二步在预演环境全流程升级加回归测试,应用的重点是 SQL 兼容(group by 隐式排序取消、部分默认值变化)与驱动版本。第三步生产升级选低峰,用备份加快速重建或原地升级工具,事先写好回退方案——原地升级没有回头路,回退等于重建,所以回退方案实质是"新实例并行跑、切流量"。第四步升级后观察期盯错误日志与慢日志一周,8.0 优化器更激进,个别 SQL 可能换了计划,备好 FORCE INDEX 的应急手段。
# 官方升级检查器扫一遍现有库 mysqlsh -- util check-for-server-upgrade root@localhost:3306
版本治理的日常纪律:生产只用 GA 稳定版、落后最新小版本不超过半年(安全补丁窗口)、所有环境版本对齐。版本越整齐,升级越像例行公事;版本越散,升级越像拆弹。
除大特性外,8.0 有一批散装小改进改变日常手感。SELECT ... FOR UPDATE 带 NOWAIT 与 SKIP LOCKED:等锁任务队列场景的革命,工作线程抢任务直接跳过被锁行,再不用轮询重试。UTF8MB4 成为默认字符集:新库天然支持表情符号,存量库仍要手动迁移。参数持久化:SET PERSIST 直接落盘,告别"改了配置文件忘了重启、重启了忘了改文件"的两头漏。资源组:给批处理任务单独一组 CPU 资源,报表再重也挤不掉在线交易。数据字典加锁改进:DDL 与查询并发的元数据锁等待大幅缓解。
-- 抢任务场景的标准写法 SELECT job_id FROM job_queue WHERE status = 0 ORDER BY job_id LIMIT 1 FOR UPDATE SKIP LOCKED;
散装改进的单项价值都不大,合在一起就是"日常手感"的代差——这也是为什么用过 8.0 的团队很难再回 5.7。
版本史的最后一课是"看着未来学历史"。8.0 之后的演进方向已经清晰:云原生架构、HeatWave 分析加速、更强的复制与容灾能力,社区在 HTAP 与可管理性上持续加码。对新特性保持关注但要按"解决了我什么问题"来筛——本书反复强调的实用主义在版本选择上同样适用:不为新而升级,为停止维护的风险、为某个真实痛点的新特性、为安全补丁而升级。版本史教给我们的判断力,最终落在这句朴素的结论上:数据库是基础设施,稳比新值钱,但停止演进本身就是最大的不稳定。
自检三问收尾。问一:你能说出自己在用版本的三个局限吗(写出瓶颈、扩展路径、已知缺陷),说不出说明还停在"会用"层。问二:最近一次版本变更的决策依据是什么,答得出具体触发因素(安全补丁、性能诉求、停止维护)才算有版本治理。问三:下一次升级的预演环境准备好了吗,没有预演环境的团队永远在下一次升级前夜才开始准备。三问的答案写进版本档案,本章的随访就算闭环。