订阅更新

MySQL 8.0有哪些值得关注的新特性?

MySQL手册 第 15 题 约 3 分钟读完

本文目录
  1. 总结
  2. 特性一:窗口函数(终于支持了!)
  3. 特性二:CTE(公用表表达式)
  4. 特性三:不可见索引(Invisible Index)
  5. 特性四:原子DDL(Atomic DDL)
  6. 特性五:默认字符集改为utf8mb4
  7. 升级要注意什么?

总结

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不会了。如果代码依赖这个行为,升级后结果顺序可能变了。

刷题进度保存在当前浏览器