目前企业生产环境主流分为两大版本:5.7 稳定版、8.0 新一代旗舰版。
很多人认为8.0只是小版本迭代,实则是架构级重构。从底层数据字典、事务机制、JOIN算法、SQL语法、索引体系到安全机制,均做了颠覆性升级。
结合上一篇讲到的Hash Join,我们知道:Hash Join 是8.0专属核心特性,也是升级8.0的核心理由之一。
一、架构层颠覆性升级(底层核心)
1.1 事务型数据字典(彻底废弃frm文件)
5.7及以前:表结构元数据存在.frm文件中,非事务型,损坏极易导致库表异常、重启报错、数据字典不一致。
8.0全新重构:
所有元数据全部存入InnoDB事务系统表
彻底删除 frm、par、trn 等一堆杂乱元数据文件
DDL操作支持事务、支持回滚、支持崩溃一致性
information_schema 查询速度提升数十倍
一句话总结:8.0彻底解决了老版本「改表崩库、元数据错乱」的历史顽疾。
1.2 原子DDL(Atomic DDL)
5.7执行大表DDL中途宕机,极易出现表结构损坏、数据半更新、残留临时文件。
8.0 所有DDL语句(建表、改表、删表、索引变更)具备原子性:
要么全部成功落地
要么全部回滚,无中间状态
生产重大利好:大表结构变更不再怕宕机、不再废表。
1.3 自增ID持久化(彻底解决主键回退BUG)
5.7致命BUG:自增ID存在内存中,重启数据库会重置自增值,极易导致主键重复冲突。
8.0修复:
自增计数器数值写入redo log持久化,重启后永久保留最新自增值,彻底杜绝主键ID回退问题。
1.4 新增innodb_dedicated_server自适应参数
能够让InnoDB根据服务器上检测到的内存大小自动配置innodb_buffer_pool_size,
innodb_log_file_size等参数,会尽可能多的占用系统可占用资源提升性能。解决非专业人员安装数据库后默认初始化数据库参数默认值偏低的问题,前提是服务器是专用来给MySQL数据库的,如果还有其他软件或者资源或者多实例MySQL使用,不建议开启该参数,不然会影响其它程序。
1.5 死锁检查控制
MySQL 8.0 增加了一个新的动态变量 innodb_deadlock_detect,用于控制系统是否
执行 InnoDB 死锁检查,默认是打开的。死锁检测会耗费数据库性能的,对于高并发的系统,我们可以关闭死锁检测功能,提高系统性能。但是我们要确保系统极少情况会发生死锁,同时要将锁等待超时参数调小一点,以防出现死锁等待过久的情况。
二、性能层重大升级
2.1 新增 Hash Join(核心重点,衔接上篇)
8.0.18+ 重磅特性,替代5.7垃圾的BNL块循环连接。
无索引大表JOIN不再CPU爆炸
小表建哈希表、大表探测,O(n+m)线性效率
仅支持等值JOIN(=)
这是企业必须升级8.0的最大理由。
2.2 废弃查询缓存 Query Cache
5.7默认开启、8.0直接彻底删除。
原因:更新频繁失效、锁竞争严重、命中率极低、严重拖累性能,属于鸡肋功能。
2.3 直方图统计信息
8.0为字段数据分布生成直方图,优化器可以精准识别:
数据倾斜场景
稀疏数据、热点数据分布
解决5.7优化器选错索引、执行计划不准的问题
效果:SQL执行计划更智能、更精准,慢SQL大幅减少。
2.4 InnoDB 并行扫描
支持多线程并行扫描数据表,COUNT(*)、批量查询、报表统计性能大幅提升。
三、索引体系全面增强(调优重点)
3.1 降序索引(Descending Index)
5.7所谓的 DESC 排序是假降序,本质还是正向索引、文件排序。
8.0真正支持降序索引:
联合索引正反排序可直接走索引,无需 filesort
解决
order by a asc, b desc无法走索引的经典问题
3.2 不可见索引(Invisible Index)
开发调优神器(使用 invisible 关键字在创建表或者进行表变更中设置索引为隐藏索引):
索引设置为不可见,优化器不再使用
索引依然存在、不删除、不影响数据写入
用于安全测试索引是否冗余、是否无效
特殊情况可以把隐藏索引快速恢复成可见
生产可用来无痛清理冗余索引,避免删索引引发故障。
3.3 表达式索引(函数索引)
5.7无法对函数、表达式建立索引,导致大量索引失效。
8.0支持直接对表达式创建索引:
create index idx_upper_name on user (upper(name));
彻底解决函数操作导致索引失效的痛点。
四、SQL语法重磅升级(开发效率暴涨)
4.1 窗口函数(Over)
8.0正式支持ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD等分析函数。窗口函数与
SUM()、COUNT() 这种分组聚合函数类似,在聚合函数后面加上over()就变成窗口函数了,在括号里可以加上partition by等分组关键字指定如何分组,窗口函数即便分组也不会将多行查询结果合并为一行,而是将结果放回多行当中,即窗口函数不需要再使用 GROUP BY。
专用窗口函数:
- 序号函数:ROW_NUMBER()、RANK()、DENSE_RANK()
- 分布函数:PERCENT_RANK()、CUME_DIST()
- 前后函数:LAG()、LEAD()
- 头尾函数:FIRST_VALUE()、LAST_VALUE()
- 其它函数:NTH_VALUE()、NTILE()
经典场景:分组排序、取每组最新数据、排名统计,不再写复杂子查询,一行SQL搞定。
4.2 CTE 公共表表达式(with语法)
支持WITH 临时结果集,支持递归查询。
SQL层级更清晰、可读性极强
替代多层嵌套子查询
支持递归树形结构查询(部门树、菜单树)
4.3 锁新语法:NOWAIT / SKIP LOCKED
解决并发排队阻塞问题,查询的行已经加锁,立即返回结果,不会像5.7一样等待超时,秒杀、库存扣减刚需:
NOWAIT:拿不到锁直接报错,不等待
SKIP LOCKED:跳过已锁定数据,直接查未锁定行
完美实现无锁排队、高并发抢购场景。
4.4 group by 不再隐式排序
五、JSON功能史诗级增强
5.7仅支持基础JSON存取,8.0完全进化为文档型数据库体验:
新增 JSON 聚合函数:
JSON_ARRAYAGG、JSON_OBJECTAGG支持 JSON 路径精准查询、批量提取
支持 JSON 字段快速更新、嵌套修改
JSON 查询性能大幅提升
现在MySQL可以直接替代部分 MongoDB 轻量文档存储场景。
六、默认配置全面优化(开箱即用)
6.1 默认字符集 utf8mb4
5.7默认 latin1,8.0默认utf8mb4,原生支持emoji表情、所有特殊字符,彻底告别乱码问题。
6.2 默认存储引擎 InnoDB
彻底弱化MyISAM,新建表全部默认InnoDB,杜绝无事务、无锁、易崩溃的MyISAM引擎问题。
6.3 参数修改持久化
MySQL 8.0版本支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中,重启MySQL时,可以从该配置文件获取到最新的配置参数。set global 设置的变量参数在mysql重启后会失效。
七、安全机制升级(企业级刚需)
7.1 新密码加密方式 caching_sha2_password
5.7是老旧的 mysql_native_password,安全性弱。
8.0默认采用 sha2 强加密,密码更安全、防暴力破解。
7.2 角色权限管理
支持角色创建、角色赋权、批量用户绑定角色,权限管理更规范,适配大型团队、多业务库权限体系。
7.3 SSL会话复用
加密连接支持会话缓存复用,提升加密连接性能,兼顾安全与效率。
八、8.0 vs 5.7 核心差异速览(面试必背)
功能点 | MySQL5.7 | MySQL8.0 |
|---|---|---|
JOIN算法 | NLJ / BNL(无索引巨慢) | 新增 Hash Join,大表关联性能暴涨 |
数据字典 | frm文件、非事务、易损坏 | InnoDB事务字典、原子DDL |
自增ID | 内存存储、重启回退 | redo持久化、永不回退 |
窗口函数/CTE | 不支持 | 全面支持 |
查询缓存 | 默认开启 | 彻底删除 |
索引能力 | 无表达式、无降序索引 | 降序、不可见、表达式索引全覆盖 |
字符集 | latin1 | utf8mb4 |
九、面试总结(100字背诵版)
MySQL8.0完成架构级重构,采用事务型数据字典与原子DDL,修复自增ID重启回退问题。新增Hash Join优化无索引大表等值关联,支持窗口函数、CTE递归、NOWAIT/SKIP LOCKED并发锁。新增降序、不可见、表达式索引,优化器引入直方图,默认utf8mb4字符集与强密码加密,彻底废弃查询缓存,性能、安全性、功能性全面升级。
十、全文终极口诀
八零重构数据典,原子DDL更安全;
自增持久不回退,哈希JOIN解难关;
窗口CTE写SQL,索引三新优化全;
锁控新增跳过等,字符安全换新颜;
废弃缓存轻装上,生产升级首选版。