MySQL8.0新特性
第十八章_MySQL8.0新特性
1.新特性概述
1. 数据库管理和存储
1.1 数据字典
-
特性: MySQL 8.0 使用统一的数据字典存储元数据(如表、列、索引等),并将其存储在 InnoDB 表中。
-
优点
:
-
提升性能:减少对文件系统的依赖。
-
提高一致性:避免元数据与实际数据不同步的问题。
-
1.2 隐式主键
-
特性: 当创建没有主键的表时,MySQL 8.0 会自动生成一个隐藏的主键。
-
优点
:
-
提高数据访问效率。
-
减少手动维护主键的麻烦。
-
2. SQL 语言增强
2.1 窗口函数
-
特性: 支持窗口函数(
OVER
子句),允许在查询中执行复杂的分析操作。 -
示例
:
SELECT name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees;
-
优点
:
-
适合排名、累计总和、移动平均等分析场景。
-
2.2 公用表表达式(CTE)
-
特性: 支持递归和非递归 CTE(
WITH
子句)。 -
示例
:
WITH RECURSIVE cte AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM cte WHERE n < 5 ) SELECT * FROM cte;
-
优点
:
-
提高查询的可读性和复用性。
-
递归查询支持层级结构数据处理。
-
2.3 JSON 增强
-
特性: 增强了对 JSON 数据类型的支持,包括 JSON 表达式、函数和索引。
-
示例
:
SELECT JSON_EXTRACT(json_column, '$.key') AS value FROM my_table;
-
新增函数:
JSON_TABLE()
、JSON_ARRAYAGG()
、JSON_OBJECTAGG()
等。 -
优点
:
-
更高效地处理半结构化数据。
-
2.4 默认值表达式
-
特性: 支持列的默认值为表达式。
-
示例
:
CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
-
优点
:
-
动态设置默认值,更灵活。
-
3. 性能优化
3.1 索引增强
-
特性: 支持隐式列的降序索引(
DESC
)。 -
优点
:
-
提高查询性能,尤其是在排序需求较多的场景中。
-
3.2 持久化生成列
-
特性: 支持生成列的持久化(
STORED
)。 -
优点
:
-
减少存储开销,同时支持复杂计算。
-
3.3 查询性能改进
-
特性: 优化器改进了查询计划的生成,支持更复杂的优化场景,如物化 CTE。
-
优点
:
-
提高复杂查询的执行效率。
-
4. 安全性增强
4.1 账户锁定和密码策略
-
特性: 支持用户账户锁定(
ACCOUNT LOCK
)和密码过期策略。 -
示例
:
ALTER USER 'user'@'localhost' ACCOUNT LOCK;
-
优点
:
-
提高账户安全性,防止暴力破解。
-
4.2 默认使用 caching_sha2_password
-
特性: 默认身份验证插件更改为
caching_sha2_password
。 -
优点
:
-
提高密码存储的安全性。
-
4.3 动态权限
-
特性: 支持动态权限,可以更细粒度地控制用户操作。
-
示例
:
GRANT BACKUP_ADMIN ON *.* TO 'user'@'localhost';
-
优点
:
-
更灵活的权限管理。
-
5. JSON 和 GIS 数据类型改进
5.1 JSON 数据类型
-
新增 JSON 函数,如
JSON_TABLE()
,用于将 JSON 数据转换为关系型数据表。 -
支持 JSON 部分更新,提升性能。
5.2 GIS 数据类型
-
特性: 改进了对 GIS 数据类型的支持,包括更高效的空间索引。
-
优点
:
-
更适合地理位置相关的应用场景。
-
6. 开发工具和可用性
6.1 错误日志管理
-
特性: 错误日志支持多种格式(如 JSON)和日志轮换。
-
优点
:
-
提高日志分析和管理的效率。
-
6.2 系统变量持久化
-
特性: 支持动态系统变量的持久化。
-
示例
:
SET PERSIST max_connections = 200;
-
优点
:
-
重启后仍然保留变量值,无需修改配置文件。
-
7. 其他改进
7.1 数据复制
-
支持基于事务的复制,增强了复制的稳定性和一致性。
-
支持并行复制,提高复制性能。
7.2 临时表改进
-
临时表默认使用 InnoDB 存储引擎,提高事务支持能力。
2.新特性1: 窗口函数
2.2 排名函数
用于给数据分配排名:
-
ROW_NUMBER()
: 为每行分配唯一的序号。 -
RANK()
: 按排序规则排名,值相同的行具有相同的排名,下一排名会跳过。 -
DENSE_RANK()
: 与RANK()
类似,但不会跳过排名。 -
NTILE(n)
: 将数据划分为n
个桶,并为每行分配桶号。
2.3 偏移函数
用于访问窗口内其他行的数据:
-
LAG(column, offset, default)
: 获取当前行之前第offset
行的值。 -
LEAD(column, offset, default)
: 获取当前行之后第offset
行的值。 -
FIRST_VALUE(column)
: 获取窗口中第一行的值。 -
LAST_VALUE(column)
: 获取窗口中最后一行的值。
2.4 比率和累计分布
-
PERCENT_RANK()
: 当前行在分组中的百分比排名。 -
CUME_DIST()
: 当前行及之前的行在分组中的累计分布比例。