MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 18

ops/2025/2/22 4:45:22/

第18章_MySQL8其它新特性

比如编码设计在8.0后直接默认utf8mb4,解决编码问题;还有登录加密方式的添加

1. MySQL8新特性概述

1. 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展,传统 的关系型数据库已经越来越不能满足需求。从5.6版本开始,MySQL就开始支持简单的NoSQL存储功能。 MySQL 8对这一功能做了优化,以更灵活的方式实现NoSQL功能,不再依赖模式(schema)。

2. 更好的索引 在查询中,正确地使用索引可以提高查询的效率。MySQL 8中新增了 隐藏索引和 降序索 引。隐藏索引可以用来测试去掉索引对查询性能的影响。在查询中混合存在多列索引时,使用降序索引 可以提高查询的性能。

3.更完善的JSON支持 MySQL从5.7开始支持原生JSON数据的存储,MySQL 8对这一功能做了优化,增加 了聚合函数 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() ,将参数聚合为JSON数组或对象,新增了行内 操作符 ->>,是列路径运算符 ->的增强,对JSON排序做了提升,并优化了JSON的更新操作。

4.安全和账户管理 MySQL 8中新增了 caching_sha2_password 授权插件、角色、密码历史记录和FIPS 模式支持,这些特性提高了数据库的安全性和性能,使数据库管理员能够更灵活地进行账户管理工作。

5.InnoDB的变化 InnoDB是MySQL默认的存储引擎 ,是事务型数据库的首选引擎,支持事务安全表 (ACID),支持行锁定和外键。在MySQL 8 版本中,InnoDB在自增、索引、加密、死锁、共享锁等方面 做了大量的 改进和优化,并且支持原子数据定义语言(DDL),提高了数据安全性,对事务提供更好的 支持。

6.数据字典 在之前的MySQL版本中,字典数据都存储在元数据文件和非事务表中。从MySQL 8开始新增 了事务数据字典,在这个字典里存储着数据库对象信息,这些数据字典存储在内部事务表中。

7. 原子数据定义语句 MySQL 8开始支持原子数据定义语句(Automic DDL),即 原子DDL 。目前,只有 InnoDB存储引擎支持原子DDL。原子数据定义语句(DDL)将与DDL操作相关的数据字典更新、存储引擎 操作、二进制日志写入结合到一个单独的原子事务中,这使得即使服务器崩溃,事务也会提交或回滚。 使用支持原子操作的存储引擎所创建的表,在执行DROP TABLE、CREATE TABLE、ALTER TABLE、 RENAME TABLE、TRUNCATE TABLE、CREATE TABLESPACE、DROP TABLESPACE等操作时,都支持原子操 作,即事务要么完全操作成功,要么失败后回滚,不再进行部分提交。 对于从MySQL 5.7复制到MySQL 8 版本中的语句,可以添加 IF EXISTS 或 IF NOT EXISTS 语句来避免发生错误。

8.资源管理 MySQL 8开始支持创建和管理资源组,允许将服务器内运行的线程分配给特定的分组,以便 线程根据组内可用资源执行。组属性能够控制组内资源,启用或限制组内资源消耗。数据库管理员能够 根据不同的工作负载适当地更改这些属性。 目前,CPU时间是可控资源,由“虚拟CPU”这个概念来表 示,此术语包含CPU的核心数,超线程,硬件线程等等。服务器在启动时确定可用的虚拟CPU数量。拥有 对应权限的数据库管理员可以将这些CPU与资源组关联,并为资源组分配线程。 资源组组件为MySQL中 的资源组管理提供了SQL接口。资源组的属性用于定义资源组。MySQL中存在两个默认组,系统组和用户 组,默认的组不能被删除,其属性也不能被更改。对于用户自定义的组,资源组创建时可初始化所有的 属性,除去名字和类型,其他属性都可在创建之后进行更改。 在一些平台下,或进行了某些MySQL的配 置时,资源管理的功能将受到限制,甚至不可用。例如,如果安装了线程池插件,或者使用的是macOS 系统,资源管理将处于不可用状态。在FreeBSD和Solaris系统中,资源线程优先级将失效。在Linux系统 中,只有配置了CAP_SYS_NICE属性,资源管理优先级才能发挥作用。

9.字符集支持 MySQL 8中默认的字符集由 latin1 更改为 合,utf8mb4_ja_0900_as_cs。 utf8mb4 ,并首次增加了日语所特定使用的集

10.优化器增强 MySQL优化器开始支持隐藏索引和降序索引。隐藏索引不会被优化器使用,验证索引的必 要性时不需要删除索引,先将索引隐藏,如果优化器性能无影响就可以真正地删除索引。降序索引允许 优化器对多个列进行排序,并且允许排序顺序不一致。

11.公用表表达式 公用表表达式(Common Table Expressions)简称为CTE,MySQL现在支持递归和非递 归两种形式的CTE。CTE通过在SELECT语句或其他特定语句前 使用WITH语句对临时结果集进行命名。 基础语法如下: WITH cte_name (col_name1,col_name2 ...) AS (Subquery) SELECT * FROM cte_name; Subquery代表子查询,子查询前使用WITH语句将结果集命名为cte_name,在后续的查询中即可使用 cte_name进行查询。

12.窗口函数 MySQL 8开始支持窗口函数。在之前的版本中已存在的大部分 聚合函数在MySQL 8中也可以 作为窗口函数来使用。

13.正则表达式支持 MySQL在8.0.4以后的版本中采用支持Unicode的国际化组件库实现正则表达式操作, 这种方式不仅能提供完全的Unicode支持,而且是多字节安全编码。MySQL增加了REGEXP_LIKE()、 EGEXP_INSTR()、REGEXP_REPLACE()和 REGEXP_SUBSTR()等函数来提升性能。另外,regexp_stack_limit和 regexp_time_limit 系统变量能够通过匹配引擎来控制资源消耗。

14.内部临时表 TempTable存储引擎取代MEMORY存储引擎成为内部临时表的默认存储引擎。TempTable存储 引擎为VARCHAR和VARBINARY列提供高效存储。internal_tmp_mem_storage_engine会话变量定义了内部 临时表的存储引擎,可选的值有两个,TempTable和MEMORY,其中TempTable为默认的存储引擎。 temptable_max_ram系统配置项定义了TempTable存储引擎可使用的最大内存数量。

15.日志记录 在MySQL 8中错误日志子系统由一系列MySQL组件构成。这些组件的构成由系统变量 log_error_services来配置,能够实现日志事件的过滤和写入。

16.备份锁 新的备份锁允许在线备份期间执行数据操作语句,同时阻止可能造成快照不一致的操作。新 备份锁由 LOCK INSTANCE FOR BACKUP 和 UNLOCK INSTANCE 语法提供支持,执行这些操作需要备份管理 员特权。

17.增强的MySQL复制 MySQL 8复制支持对 JSON文档 进行部分更新的 二进制日志记录,该记录 使用紧凑 的二进制格式,从而节省记录完整JSON文档的空间。当使用基于语句的日志记录时,这种紧凑的日志记 录会自动完成,并且可以通过将新的binlog_row_value_options系统变量值设置为PARTIAL_JSON来启用。

1.2 MySQL8.0移除的旧特性

在MySQL 5.7版本上开发的应用程序如果使用了MySQL8.0 移除的特性,语句可能会失败,或者产生不同 的执行结果。为了避免这些问题,对于使用了移除特性的应用,应当尽力修正避免使用这些特性,并尽 可能使用替代方法。

 2. 新特性1:窗口函数

 如果用分组和聚合函数,就需要分好几步来计算。

第一步,计算总销售金额,并存入临时表 a:

第二步,计算每个城市的销售总额并存入临时表 b:

第三步,计算各区的销售占所在城市的总计金额的比例,和占全部销售总计金额的比例。我们可以通过 下面的连接查询获得需要的结果:

CREATE TEMPORARY TABLE a  -- 创建临时表
SELECT SUM(sales_value) AS sales_value -- 计算总计金额
FROM sales;SELECT * FROM a;CREATE TEMPORARY TABLE b  -- 创建临时表
SELECT city, SUM(sales_value) AS sales_value -- 计算城市销售合计
FROM sales
GROUP BY city;SELECT * FROM b;SELECT s.city AS 城市, s.county AS 区, s.sales_value AS 区销售额,
b.sales_value AS 市销售额, s.sales_value/b.sales_value AS 市比率,
a.sales_value AS 总销售额, s.sales_value/a.sales_value AS 总比率
FROM sales s
JOIN b ON (s.city=b.city) -- 连接市统计结果临时表
JOIN a -- 连接总计金额临时表
ORDER BY s.city, s.county;
#方法二
SELECT city AS 城市, county AS 区, sales_value AS 区销售额,
SUM(sales_value) OVER(PARTITION BY city) AS 市销售额, -- 计算市销售额
sales_value/SUM(sales_value) OVER(PARTITION BY city) AS 市比率,
SUM(sales_value) OVER() AS 总销售额, -- 计算总销售额
sales_value/SUM(sales_value) OVER() AS 总比率
FROM sales
ORDER BY city, county;

窗口函每一步都是单独的窗口,互不干扰。使用窗口函数,只用了一步就完成了查询。而且,由于没有用到临时表,执行的效率也更高了。很显 然,在这种需要用到分组统计的结果对每一条记录进行计算的场景下,使用窗口函数更好。

94-MySQL8.0新特性_窗口函数的使用_哔哩哔哩_bilibili 到37.25

2.2 窗口函数分类

MySQL从8.0版本开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组 操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。窗口函数相当于给每条记录添加了虚拟聚合结果列;order by 平时练习都是搭配聚合函数的 但是单独使用是按照部门id归并到一条

函数分类函数函数说明
序号函数ROW_NUMBER()顺序排序
序号函数RANK()并列排序,会跳过重复的序号,比如序号为1、1、3
序号函数DENSE_RANK()并列排序,不会跳过重复的序号,比如序号为1、1、2
分布函数PERCENT_RANK()等级值百分比
分布函数CUME_DIST()累积分布值
前后函数LAG(expr, n)返回当前行的前n行的expr的值
前后函数LEAD(expr, n)返回当前行的后n行的expr的值
首尾函数FIRST_VALUE(expr)返回第一个expr的值
首尾函数LAST_VALUE(expr)返回最后一个expr的值
其他函数NTH_VALUE(expr, n)返回第n个expr的值
其他函数NTILE(n)将分区中的有序数据分为n个桶,记录桶编号
#1. 序号函数
#1.1 ROW_NUMBER() 函数
#举例:查询 goods 数据表中每个商品分类下价格降序排列的各个商品信息。
SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,
id, category_id, category, NAME, price, stock
FROM goods;#举例:查询 goods 数据表中每个商品分类下价格最高的3种商品信息。
SELECT *
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,id, category_id, category, NAME, price, stockFROM goods) t
WHERE row_num <= 3;#1.2 RANK() 函数
#举例:使用RANK()函数获取 goods 数据表中各类别的价格从高到低排序的各商品信息。
SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,
id, category_id, category, NAME, price, stock
FROM goods;#2. 分布函数
#2.1 PERCENT_RANK() 函数
#举例:计算 goods 数据表中名称为“女装/女士精品”的类别下的商品的PERCENT_RANK值。
# 方式1:
SELECT RANK() OVER w AS r,
PERCENT_RANK() OVER w AS pr,
id, category_id, category, NAME, price, stock
FROM goods
WHERE category_id = 1 WINDOW w AS (PARTITION BY category_id ORDER BY price DESC);# 方式2:
SELECT RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS r,
PERCENT_RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS pr,
id, category_id, category, NAME, price, stock
FROM goods
WHERE category_id = 1;#2.2 CUME_DIST() 函数
#举例:查询goods数据表中小于或等于当前价格的比例。
SELECT CUME_DIST() OVER (PARTITION BY category_id ORDER BY price ASC) AS cd,
id, category, NAME, price
FROM goods;#3. 前后函数
#3.1 LAG(expr, n) 函数
#举例:查询goods数据表中前一个商品价格与当前商品价格的差值。
SELECT id, category, NAME, price, pre_price, price - pre_price AS diff_price
FROM (SELECT id, category, NAME, price, LAG(price, 1) OVER w AS pre_priceFROM goodsWINDOW w AS (PARTITION BY category_id ORDER BY price)) t;其中子查询如下
SELECT id, category, NAME, price, LAG(price, 1) OVER (PARTITION BY category_id ORDER BY price) AS pre_price
FROM goods#3.2 LEAD(expr, n) 函数
#举例:查询goods数据表中后一个商品价格与当前商品价格的差值。
SELECT id, category, NAME, price, behind_price, behind_price - price AS diff_price
FROM (SELECT id, category, NAME, price, LEAD(price, 1) OVER w AS behind_priceFROM goodsWINDOW w AS (PARTITION BY category_id ORDER BY price)) t;其中,子查询为:
SELECT id, category, NAME, price, LEAD(price, 1) OVER (PARTITION BY category_id ORDER BY price) AS behind_price
FROM goods#4. 首尾函数
#4.1 FIRST_VALUE(expr) 函数
#举例:按照价格排序,查询第1个商品的价格信息。
SELECT id, category, NAME, price, stock, FIRST_VALUE(price) OVER (PARTITION BY category_id ORDER BY price) AS first_price
FROM goods#4.2 LAST_VALUE(expr) 函数#5. 其他函数
#5.1 NTH_VALUE(expr, n) 函数
#举例:查询goods数据表中排名第2和第3的价格信息。
SELECT id, category, NAME, price,
NTH_VALUE(price, 2) OVER (PARTITION BY category_id ORDER BY price) AS second_price,
NTH_VALUE(price, 3) OVER (PARTITION BY category_id ORDER BY price) AS third_price
FROM goods#5.2 NTILE(n) 函数
#举例:将goods表中的商品按照价格分为3组。
SELECT NTILE(3) OVER (PARTITION BY category_id ORDER BY price) AS nt, id, category, NAME, price
FROM goods;

 3. 新特性2:公用表表达式

  95-公用表表达式_课后练习_最后寄语_哔哩哔哩_bilibili

课后练习

#第18章_MySQL8.0的其它新特性的课后练习#1. 创建students数据表,如下CREATE DATABASE test18_mysql8;USE test18_mysql8;CREATE TABLE students(
id INT PRIMARY KEY AUTO_INCREMENT,
student VARCHAR(15),
points TINYINT
);#2. 向表中添加数据如下
INSERT INTO students(student,points)
VALUES
('张三',89),
('李四',77),
('王五',88),
('赵六',90),
('孙七',90),
('周八',88);SELECT * FROM students;#3. 分别使用RANK()、DENSE_RANK() 和 ROW_NUMBER()函数对学生成绩降序排列情况进行显示
#方式1:
SELECT 
ROW_NUMBER() OVER (ORDER BY points DESC) AS "排序1",
RANK() OVER (ORDER BY points DESC) AS "排序2",
DENSE_RANK() OVER (ORDER BY points DESC) AS "排序3",
student,points
FROM students;#方式2:
SELECT 
ROW_NUMBER() OVER w AS "排序1",
RANK() OVER w AS "排序2",
DENSE_RANK() OVER w AS "排序3",
student,points
FROM students WINDOW w AS (ORDER BY points DESC);

http://www.ppmy.cn/ops/160427.html

相关文章

源码方式安装llama.cpp及调试

llama.cpp源码方式安装和调试配置 构建和编译 注意这里是cuda&#xff0c;且要开启debug模式 cmake -B build -DGGML_CUDAON -DCMAKE_BUILD_TYPEDebug cmake --build build --config Debug正在编译&#xff1a; 配置launch.json用于调式&#xff1a; 要根据自己的环境路径…

HttpServletRequest

在 Spring 框架中&#xff0c;HttpServletRequest 和 RequestBody JSONObject 是两种常见的参数注入方式&#xff0c;用于处理 HTTP 请求的数据。 1. HttpServletRequest servletRequest HttpServletRequest 是 Java Servlet API 中的一个接口&#xff0c;Spring MVC 中也使用…

基于 Spring Boot + 微信小程序的短文写作竞赛管理系统设计与实现(源码+文档)

大家好&#xff0c;今天要和大家聊的是一款基于 Spring Boot 微信小程序的“短文写作竞赛管理系统”的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 Spring Boot 微信小程序的“短文写作竞赛管理系统”设计与实现的主要使用…

LINUX安装使用Redis

参考 Install Redis on Linux | Docs 安装命令 sudo apt-get install -y lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgsudo chmod 644 /usr/share/keyrings/redis-archive-keyrin…

AI、Java、C++、C#等技术学习资源链接汇总

AI、Java、C、C#等技术学习资源链接汇总 一、AI学习资源 AIGC知识库&#xff1a;一站式人工智能知识库 链接&#xff1a;AI知识库 语雀 AI创业知识库 链接&#xff1a;Docs Learn Prompt&#xff08;免费&支持中英切换&#xff09; 链接&#xff1a;Learn Prompt: Your …

pytorch cnn 实现猫狗分类

文章目录 [toc] 1. 导入必要的库2. 定义数据集类3. 数据预处理和加载4. 定义 CNN 模型5. 定义损失函数和优化器6. 训练模型7. 保存模型8. 使用模型进行预测9 完整代码10. 总结 1. 导入必要的库 import torch import torch.nn as nn import torch.optim as optim from torch.ut…

管理WSL实例 以及安装 Ubuntu 作为 WSL 子系统 流程

安装ubuntu wsl --install -d Ubuntu分类命令说明安装相关wsl --install在 Windows 10/11 上以管理员身份在 PowerShell 中运行此命令&#xff0c;可安装 WSLwsl --install -d <distribution name>在 PowerShell 中使用此命令安装特定版本的 Linux 发行版&#xff0c;如…

HTTP.

HTTP主要讲一下状态码和缓存机制 1xx 类状态码属于提示信息&#xff0c;是协议处理中的一种中间状态&#xff0c;如http升级为websocket&#xff0c;会提示1xx 2xx 类状态码表示服务器成功处理了客户端的请求 「200 OK」是最常见的成功状态码「204 No Content」也是常见的成功…