阿里面试题:MySQL 5.x和8.0有什么区别?

83 阅读4分钟

文章内容收录到个人网站,方便阅读:hardyfish.top/

资料分享

MySQ技术内幕第5版:

深入浅出MySQL:

高性能MySQL第三版:

MySQL 5.x 和 MySQL 8.0 主要区别

MySQL 8.0 相比 MySQL 5.7 进行了大量改进,涵盖了性能优化、SQL 功能增强、索引优化、JSON 支持、安全性提升等多个方面

1. 性能优化

✅ MySQL 8.0 性能比 5.7 提高 2 倍

MySQL 8.0 在以下方面优化了性能:

  • 更好的读/写并发性能(改进 InnoDB 并发控制)。
  • 改进 IO 密集型工作负载(减少磁盘 IO,优化 Buffer Pool)。
  • 热点竞争优化(降低全局锁争用,提高事务处理能力)。

📌 结论MySQL 8.0 对高并发、高 IO 负载的场景优化明显。

2. NoSQL 支持

✅ 提供更完善的 JSON 存储

  • MySQL 5.7 引入了 JSON 数据类型,但功能有限。

  • MySQL 8.0增强了 JSON 支持:

    • JSON_TABLE():可以将 JSON 解析为表结构进行查询。
    • JSON_ARRAYAGG()JSON_OBJECTAGG():对 JSON 进行聚合运算。
    • JSON_EXTRACT():从 JSON 中提取数据。

📌 结论:MySQL 8.0 提供了更完善的 JSON 处理能力,适用于 NoSQL + 关系型混合存储场景。

3. SQL 语法增强

✅ 窗口函数(Window Functions)

MySQL 8.0 支持窗口函数(如 RANK()DENSE_RANK()ROW_NUMBER() 等),可用于按窗口范围进行排序、聚合计算。

示例:

SELECT id, name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;

📌 结论MySQL 8.0 窗口函数可以实现更复杂的数据分析计算,而 MySQL 5.7 只能通过子查询或 GROUP BY 处理。

✅ 公用表表达式(CTE - Common Table Expressions)

MySQL 8.0 支持 CTE,可以避免复杂查询中的嵌套子查询,提高 SQL 可读性。

示例:

WITH cte AS (
    SELECT id, name, department FROM employees WHERE salary > 5000
)
SELECT * FROM cte WHERE department = 'IT';

📌 结论:MySQL 8.0 使用 CTE 让 SQL 逻辑更清晰,可读性更强

SELECT FOR UPDATE 支持 NOWAIT / SKIP LOCKED

  • MySQL 5.7:当某行被锁定时,查询会一直等待。

  • MySQL 8.0:NOWAIT:如果行被锁定,则立即报错,不等待。

    • SKIP LOCKED:跳过已锁定的行,不等待。

📌 结论:MySQL 8.0 优化了行锁机制,适合高并发并行任务的处理

4. 索引优化

✅ 隐藏索引(Invisible Indexes)

MySQL 8.0 允许索引“隐藏” ,而不删除索引:

ALTER TABLE employees ALTER INDEX emp_name_idx INVISIBLE;

📌 结论:隐藏索引可以测试某个索引是否影响查询性能,避免误删索引导致查询变慢。

✅ 降序索引(Descending Index)

MySQL 8.0 支持降序索引,比 MySQL 5.7 需要额外排序(ORDER BY DESC)更高效:

CREATE INDEX emp_salary_desc_idx ON employees (salary DESC);

📌 结论:MySQL 8.0 索引支持 DESC,提升 ORDER BY 性能

5. 可靠性增强

✅ InnoDB 表 DDL 事务化

MySQL 8.0 支持 DDL 事务,可保证 DDL 语句执行的原子性:

  • MySQL 5.7:DDL 执行失败可能导致数据不完整。
  • MySQL 8.0:DDL 失败可回滚,保证数据完整性

📌 结论:MySQL 8.0 DDL 也支持事务,避免部分成功导致数据异常

6. 高可用性(HA - High Availability)

✅ InnoDB 集群

MySQL 8.0 支持 InnoDB Group Replication,用于分布式高可用部署

  • 自动主从切换(Failover)
  • 支持多主模式

📌 结论:MySQL 8.0 原生支持高可用集群,无需手动配置主从复制

7. 安全性增强

✅ 默认身份验证插件

MySQL 8.0 默认使用更安全的身份验证插件

sql
CREATE USER 'user'@'%' IDENTIFIED WITH caching_sha2_password BY 'password';

📌 结论:MySQL 8.0 提升了数据库访问安全性

8. 默认字符集

utf8mb4 成为默认字符集

  • MySQL 5.7:默认 latin1,需要手动指定 utf8mb4
  • MySQL 8.0:默认 utf8mb4支持完整的 Unicode(如 Emoji 表情)

📌 结论:MySQL 8.0 默认支持 UTF-8,解决了字符集兼容问题

9. 查询缓存

✅ MySQL 8.0 移除了查询缓存

  • MySQL 5.7:查询缓存存在严重的锁争用问题,影响并发性能。
  • MySQL 8.0:移除查询缓存,推荐使用 Redis、Memcached 进行缓存

📌 结论:MySQL 8.0 取消查询缓存,提高并发查询性能

总结:MySQL 5.x vs MySQL 8.0

对比项MySQL 5.7 及以下MySQL 8.0
性能优化并发 & IO,性能提升 2 倍
NoSQL 支持JSON 支持有限增强 JSON 查询,支持 JSON_TABLE()
窗口函数❌ 不支持RANK()ROW_NUMBER()
CTE❌ 不支持WITH cte AS (...) 语法
SELECT FOR UPDATE阻塞等待✅ 支持 NOWAITSKIP LOCKED
索引优化无隐藏索引✅ 支持 INVISIBLE INDEX
降序索引ORDER BY DESC 额外排序CREATE INDEX ... DESC
事务 DDL❌ 不支持✅ 支持事务性 DDL
高可用传统主从复制✅ InnoDB Group Replication
安全性明文密码caching_sha2_password
默认字符集latin1utf8mb4
查询缓存存在❌ 已移除

MySQL 8.0 提供了更高的性能、更丰富的 SQL 语法、更好的 JSON 支持、更安全的身份验证,是企业级数据库的首选! 🚀