【JAVA高级篇教学】第四篇:MySQL 5.7 与 MySQL 8 的区别
MySQL 是最流行的开源数据库管理系统之一,而 MySQL 8 的发布相较于 MySQL 5.7 带来了大量的改进与功能增强。
目录
一、性能改进
二、功能增强
三、安全性
四、开发体验
五、默认排序规则
六、支持的排序规则数量
七、区分敏感性(Sensitivity)增强
八、Unicode 排序的改进
九、性能改进
十、自定义排序规则
示例对比
MySQL 5.7 排序规则示例:
MySQL 8 排序规则示例:
总结
一、性能改进
- 查询性能
MySQL 8 中引入了许多查询优化功能,如基于成本的优化器改进、并行查询执行支持等,使复杂查询的效率显著提升。 - JSON 性能
MySQL 8 在 JSON 数据类型处理上更高效,并引入了 JSON 表达式索引,提升了基于 JSON 的查询性能。 - 持久性改进
MySQL 8 对 redo log 和 undo log 的处理更高效,事务提交性能比 5.7 更好。
二、功能增强
-
窗口函数
MySQL 8 新增了对窗口函数的支持(如ROW_NUMBER()
、RANK()
),这在分析性查询中非常有用。而 MySQL 5.7 不支持此功能。 -
通用表表达式(CTE)
MySQL 8 增加了对 CTE(如WITH
语句)的支持,可以更方便地进行递归查询和复杂查询分解。 -
默认字符集
MySQL 8 默认字符集为utf8mb4
,支持更多的字符集和表情符号。MySQL 5.7 的默认字符集是latin1
。 -
JSON 支持改进
虽然 MySQL 5.7 引入了 JSON 数据类型,但 MySQL 8 中新增了 JSON_TABLE 函数,可以更灵活地将 JSON 数据作为表格处理。
三、安全性
-
账户管理
MySQL 8 支持角色(Roles),可以将权限分组后分配给用户,从而简化权限管理。而 MySQL 5.7 中需要单独管理每个用户的权限。 -
默认密码插件
MySQL 8 默认使用更强的密码认证插件(caching_sha2_password
),增强了安全性,而 5.7 使用的是mysql_native_password
。 -
加密与数据保护
MySQL 8 增强了对 TLS 连接的支持,并且支持更灵活的加密方案。
四、开发体验
-
数据字典
MySQL 8 将数据字典存储在 InnoDB 表中,而 MySQL 5.7 使用文件系统存储元数据。新方法减少了文件碎片化,提高了元数据查询性能。 -
系统变量管理
MySQL 8 中,许多系统变量支持动态修改,而 MySQL 5.7 对部分变量需要重启服务后才能生效。 -
错误日志系统
MySQL 8 提供了统一的错误日志框架,可以将日志输出到 JSON 文件或其他更现代的格式。
五、默认排序规则
-
MySQL 5.7
默认字符集是latin1
,默认排序规则为latin1_swedish_ci
。对于大多数应用来说,latin1
字符集的默认排序规则并不适用多语言支持。 -
MySQL 8
默认字符集升级为utf8mb4
,默认排序规则为utf8mb4_0900_ai_ci
。这意味着 MySQL 8 默认支持更多语言和符号,同时采用了更现代化的排序规则,处理 Unicode 数据更加标准化。
六、支持的排序规则数量
-
MySQL 5.7
MySQL 5.7 支持的排序规则较少,主要集中在常用字符集上,比如latin1
和utf8
。它在一些多语言场景(如中文、日文和韩文)中的排序规则较为有限。 -
MySQL 8
MySQL 8 大幅增加了排序规则的数量,尤其是对utf8mb4
字符集,支持了大量与 Unicode 标准相关的排序规则(如utf8mb4_ja_0900_as_cs
用于日语,utf8mb4_zh_0900_as_cs
用于中文)。- 新增的规则以
_0900
开头,基于 Unicode Collation Algorithm (UCA) 9.0。 - 提供了对特定语言优化的排序规则,例如德语、法语等。
- 新增的规则以
七、区分敏感性(Sensitivity)增强
排序规则根据以下属性来定义区分敏感性:
-
ci
(Case Insensitive):大小写不敏感。 -
cs
(Case Sensitive):大小写敏感。 -
ai
(Accent Insensitive):重音不敏感。 -
as
(Accent Sensitive):重音敏感。 -
MySQL 5.7
排序规则的区分敏感性支持有限。例如,utf8_general_ci
默认大小写和重音不敏感。 -
MySQL 8
增强了区分敏感性的灵活性,引入了更多以_as
或_cs
结尾的排序规则。- 例如:
utf8mb4_0900_as_cs
是大小写和重音敏感排序规则。
- 例如:
八、Unicode 排序的改进
-
MySQL 5.7
基于 Unicode 4.0 实现排序规则,这在处理现代语言需求时可能会有不一致的表现,尤其是对于 emoji 和最新 Unicode 字符。 -
MySQL 8
升级到 Unicode 9.0 标准,改进了对现代语言和符号(如 emoji)的排序支持。此外,MySQL 8 对多语言排序的兼容性更强,能够更精确地处理字符的语义排序。
九、性能改进
-
MySQL 5.7
排序规则性能有限,对于复杂排序(尤其是涉及多语言的排序)可能会变慢。 -
MySQL 8
排序规则的性能得到优化,尤其是在使用 Unicode 排序规则时,MySQL 8 的排序效率显著提高。
十、自定义排序规则
-
MySQL 5.7 和更早版本
不支持用户定义排序规则,所有排序规则都由系统预定义。 -
MySQL 8
提供了更多内置排序规则,但仍不支持用户自定义排序规则。
示例对比
MySQL 5.7 排序规则示例:
SELECT name FROM users ORDER BY name COLLATE utf8_general_ci;
使用的是 Unicode 4.0 的排序规则,适用于大部分语言,但不支持最新的 Unicode 特性。
MySQL 8 排序规则示例:
SELECT name FROM users ORDER BY name COLLATE utf8mb4_0900_ai_ci;
基于 Unicode 9.0,支持更多字符和更复杂的语言排序规则。
总结
- 功能丰富度:MySQL 8 提供了更丰富的排序规则,特别是针对 Unicode 和多语言的支持。
- 默认规则:MySQL 8 默认采用
utf8mb4_0900_ai_ci
,更现代化且支持更多字符。 - 性能和准确性:MySQL 8 在排序规则的性能和准确性上有显著提升,特别是在支持复杂语言排序和 Unicode 标准方面。