golang,go,博客,开源,编程

mysql 5.7 与 8.0 的区别

Published on with 0 views and 0 comments

MySQL 5.7 与 MySQL 8.0 在多个方面有着显著的区别和改进。MySQL 8.0 引入了许多新特性、改进和优化,相比 MySQL 5.7,它提供了更强的性能、更多的功能、更好的兼容性以及更高的安全性。

以下是 MySQL 5.7 与 MySQL 8.0 之间的一些主要区别:

1. 性能优化

1.1 查询优化

  • MySQL 8.0 引入了改进的 查询优化器,包括更加智能的查询计划选择、成本估算、和更好的联接优化。例如,MySQL 8.0 提升了对 窗口函数公共表表达式(CTE)的支持,这对于复杂的查询非常有帮助。
  • MySQL 5.7 的查询优化较为基础,许多优化策略较为传统,性能相对较低,尤其在复杂查询和大量数据的场景下。

1.2 并行查询

  • MySQL 8.0 引入了 并行查询(Parallel Query Execution),该特性能显著提高涉及大量数据的查询性能。它可以同时执行多个线程来完成查询,从而加速执行速度。
  • MySQL 5.7 并没有对并行查询做专门的优化。

1.3 InnoDB改进

  • MySQL 8.0InnoDB 存储引擎 做了许多优化,如更高效的 数据字典,更高效的 并发控制,以及更好的 性能模式
  • MySQL 5.7 中的 InnoDB 存储引擎已经成熟,但在性能和新功能支持方面逊色于 MySQL 8.0。

2. SQL语法与功能增强

2.1 窗口函数和公共表表达式(CTE)

  • MySQL 8.0 提供了对 窗口函数(Window Functions)和 公共表表达式(CTE)的支持。这些特性对于执行更复杂的查询(如排名、滑动窗口等)非常有用。
    例子:
    -- 窗口函数示例
    SELECT id, name, ROW_NUMBER() OVER (ORDER BY age) AS row_num
    FROM users;
    
    -- 公共表表达式(CTE)示例
    WITH temp AS (SELECT * FROM users WHERE age > 30)
    SELECT * FROM temp;
    
  • MySQL 5.7 并不支持窗口函数或公共表表达式。

2.2 JSON 支持

  • MySQL 8.0JSON 数据类型提供了更多的操作符和函数,支持更加丰富的 JSON 查询和操作,例如:JSON_TABLEJSON_ARRAYAGG 等,极大提升了对 JSON 数据的支持。
    例子:
    SELECT JSON_EXTRACT(data, '$.name') FROM my_table;
    
  • MySQL 5.7 虽然引入了 JSON 数据类型,但功能比较基础,缺乏对复杂查询的支持。

2.3 角色管理与授权

  • MySQL 8.0 引入了 角色管理,可以更方便地管理用户权限。管理员可以创建角色并将权限分配给角色,然后将角色分配给用户,简化了权限管理。
    例子:
    CREATE ROLE 'read_only';
    GRANT SELECT ON *.* TO 'read_only';
    GRANT 'read_only' TO 'user1';
    
  • MySQL 5.7 不支持角色管理,权限只能逐个分配给用户,权限管理相对较为繁琐。

3. 数据字典

  • MySQL 8.0 引入了全新的 数据字典(Data Dictionary),所有的数据库元数据(如表结构、索引、用户权限等)都存储在 InnoDB 表中,而不再使用 .frm 文件。这让 MySQL 8.0 在管理数据库元数据时更加高效、可靠,并能提供更强的事务支持。
  • MySQL 5.7 使用的是传统的元数据存储方式,如 .frm 文件格式,它的管理方式相对较为分散,不如 MySQL 8.0 统一和高效。

4. 默认字符集

  • MySQL 8.0 将默认字符集更改为 utf8mb4,这是一个更全面支持 Unicode 字符的字符集,它支持更多的字符(例如表情符号)。
  • MySQL 5.7 的默认字符集是 utf8,但 utf8 并不能完全支持 Unicode 中的所有字符,尤其是一些特殊字符(如表情符号)不能被存储。

5. 事务和隔离级别

  • MySQL 8.0 对事务和隔离级别进行了改进,提供了更精细的控制。比如,支持更多的并发和数据一致性机制,尤其是在多核 CPU 上的性能优化。
  • MySQL 5.7 的事务和隔离级别支持较为传统,虽然性能上已经很不错,但在 MySQL 8.0 中有了更深层次的优化。

6. 性能监控与诊断

  • MySQL 8.0 增强了性能监控和诊断功能,引入了 性能模式(Performance Schema)的增强,提供了更多的 诊断表监控工具,如 sys 模式下的一些内置视图,可以更方便地分析数据库性能。
  • MySQL 5.7 的性能监控功能相对较为基础,虽然也提供了 performance_schema,但功能和易用性较 MySQL 8.0 有差距。

7. 索引与存储引擎改进

  • MySQL 8.0 改进了 InnoDB 存储引擎,引入了更加高效的 全局临时表倒排索引(Full-text Search),提高了文本搜索性能,并且在内存管理、锁机制、并发控制等方面进行了优化。
  • MySQL 5.7 中的 InnoDB 存储引擎已非常成熟,但在 MySQL 8.0 中,许多新的特性和改进使得它在大规模应用下表现更加优秀。

8. 安全性改进

  • MySQL 8.0 增强了 默认加密认证插件,比如支持更强的密码存储算法(例如 caching_sha2_password 认证插件)和默认启用的加密连接。
  • MySQL 5.7 的安全性功能相对较为基础,虽然支持 SSL 加密连接和一些加密功能,但默认配置可能没有 MySQL 8.0 那么严格。

9. 默认配置与行为变化

  • MySQL 8.0 引入了许多默认配置和行为上的变化,如启用 strict mode(严格模式)默认启用,使得 SQL 查询更严格,数据验证更强。
  • MySQL 5.7 的默认配置相比 MySQL 8.0 更宽松,可能导致一些不规范的数据写入。

10. 弃用和删除的特性

  • MySQL 8.0 弃用了某些旧的特性,并删除了一些过时的功能,如 query_cache(查询缓存),这有助于提升性能并简化系统管理。
  • MySQL 5.7 仍然支持一些旧的特性,如 query_cache,但这些特性在 MySQL 8.0 中已被移除或弃用。

总结

MySQL 8.0 相比 MySQL 5.7 具有很多重要的改进,涵盖了性能、功能、SQL 语法、字符集、索引管理、事务支持、以及安全性等方面。MySQL 8.0 提供了更多的现代化特性,使得开发者和管理员能够更好地管理和优化数据库系统。

  • MySQL 8.0 适用于更复杂的应用场景,尤其是对于高并发、复杂查询、大数据量、需要高度安全和性能优化的应用。
  • MySQL 5.7 适合一些对性能和功能要求不那么高的应用,或者需要稳定性的现有项目。

标题:mysql 5.7 与 8.0 的区别
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/07/1736216733286.html
联系:scotttu@163.com