文章内容收录到个人网站,方便阅读:hardyfish.top/
资料分享
MySQ技术内幕第5版:
- 资料链接:url81.ctfile.com/f/57345181-…
- 访问密码:3899
深入浅出MySQL:
- 资料链接:url81.ctfile.com/f/57345181-…
- 访问密码:3899
高性能MySQL第三版:
- 资料链接:url81.ctfile.com/f/57345181-…
- 访问密码:3899
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 | 阻塞等待 | ✅ 支持 NOWAIT 和 SKIP LOCKED |
索引优化 | 无隐藏索引 | ✅ 支持 INVISIBLE INDEX |
降序索引 | ORDER BY DESC 额外排序 | ✅ CREATE INDEX ... DESC |
事务 DDL | ❌ 不支持 | ✅ 支持事务性 DDL |
高可用 | 传统主从复制 | ✅ InnoDB Group Replication |
安全性 | 明文密码 | ✅ caching_sha2_password |
默认字符集 | latin1 | ✅ utf8mb4 |
查询缓存 | 存在 | ❌ 已移除 |
✅ MySQL 8.0 提供了更高的性能、更丰富的 SQL 语法、更好的 JSON 支持、更安全的身份验证,是企业级数据库的首选! 🚀