MySQL 8.0有哪些值得关注的新特性?
本文目录
总结
8.0最有价值的特性:窗口函数、CTE、不可见索引、原子DDL、utf8mb4默认。面试时能主动提到这些,说明你对技术演进有关注。再加上升级踩坑经验,更有说服力。
第11-15篇完结。后续将继续聊备份恢复实战、SQL注入防御、MySQL的内存管理、字符集踩坑、项目经验表达等实战场景。
你们升级过MySQL 8.0吗?遇到什么坑?评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
MySQL 8.0是一次大版本升级,引入了很多实用功能。面试时如果你能主动提到8.0的新特性,说明你对技术演进有关注,非常加分。今天挑生产环境最有价值的几个讲。
特性一:窗口函数(终于支持了!)
MySQL 8.0之前不支持窗口函数,要做ROW_NUMBER、LAG、RANK等操作只能用复杂的子查询变量来模拟。现在终于原生支持了。
-- MySQL 8.0:每个用户的最新订单
SELECT * FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders
) t WHERE rn = 1;
这对从大数据转后端的同学来说是巨大的好消息——以前在Hive里写惯的窗口函数,现在MySQL里也能用了。
特性二:CTE(公用表表达式)
WITH语法让复杂SQL变得可读性更好:
-- 用CTE改写复杂的子查询
WITH active_users AS (
SELECT user_id, COUNT(1) AS login_cnt
FROM user_login
WHERE login_date >= '2025-03-01'
GROUP BY user_id
HAVING COUNT(1) >= 7
)
SELECT u.user_id, u.nickname, a.login_cnt
FROM users u
JOIN active_users a ON u.id = a.user_id;
还支持递归CTE,可以处理树形结构数据(比如部门层级、评论嵌套)。
特性三:不可见索引(Invisible Index)
可以把某个索引设为“不可见”,优化器不会使用它,但索引仍然被维护。这对于“删索引前先测试影响”非常有用:
-- 把索引设为不可见(试试删除后的影响)
ALTER TABLE orders ALTER INDEX idx_status INVISIBLE;
-- 观察几天,确认没问题后再真正删除
ALTER TABLE orders DROP INDEX idx_status;
-- 如果有问题,可以立刻恢复
ALTER TABLE orders ALTER INDEX idx_status VISIBLE;
这个功能我在生产环境用过很多次。之前删索引很慎重,因为删了发现有问题要重建很耗时。现在用Invisible Index先测试,安全很多。
特性四:原子DDL(Atomic DDL)
8.0之前,DROP TABLE t1, t2如果在t2时失败,t1已经被删了但t2还在,状态不一致。8.0支持DDL的原子性,要么全成功要么全失败。
特性五:默认字符集改为utf8mb4
5.7默认是latin1,经常导致中文乱码。8.0默认utf8mb4,终于不用每次建表都加CHARACTER SET utf8mb4了。
升级要注意什么?
我在出海硬件公司从5.7升到8.0时,遇到过两个坑:
① 默认认证插件变了: 8.0默认用caching_sha2_password,老的客户端可能连不上。需要改回 mysql_native_password或升级客户端。
② GROUP BY不再隐式排序: 5.7的GROUP BY会隐式加ORDER BY,8.0不会了。如果代码依赖这个行为,升级后结果顺序可能变了。