第十八章_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()
: 当前行及之前的行在分组中的累计分布比例。