文章目录
- 学习资料
- 常见的数据库管理系统排名(DBMS)
- SQL的分类
- DDL:数据定义语言
- DML:数据操作语言
- DCL:数据控制语言
- MySQL8.0新特性
- 性能优化
- 默认字符集
- DDL的原子化
- 计算列
- 宽度属性
- 窗口函数
- 公用表表达式
- 索引新特性
- 支持降序索引
- 隐藏索引
学习资料
【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】
【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java
常见的数据库管理系统排名(DBMS)
目前互联网上常见的数据库管理软件有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、informix这几种,如下是2022年DB-Engines Ranking对数据库受欢迎程度进行调查后的统计结果:查看数据库最新排名:https://db-engines.com/en/ranking
对应走势图:https://db-engines.com/en/ranking_trend
SQL的分类
DDL:数据定义语言
CREATE、ALTER、DROP、RENAME、TRUNCATE
DML:数据操作语言
INSERT、DELETE、UPDATE、SELECT
DCL:数据控制语言
COMMIT、ROLLBACK、SAVEPOINT、GRANT、REVOKE
MySQL8.0新特性
非全部新特性,仅是自我感觉用得着,并且非常重要的。
性能优化
性能峰值几乎是5.7的两倍。
默认字符集
在MySQL 8.0版本之前,默认字符集为latin1 ,utf8字符集指向的是utf8mb3 。网站开发人员在数据库设计的时候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL8.0开始,数据库的默认编码将改为utf8mb4 ,从而避免上述乱码的问题。
DDL的原子化
在MySQL8.0版本中,InnoDB表的DDL支持事务完整性,即DDL操作要么成功要么回滚。DDL操作回滚日志写入到data dictionary数据字典mysql.innodb_ddl_log(该表是隐藏的表,通过show tables无法看到)中,用于回滚操作。通过设置参数,可将DDL操作日志打印输出到MySQL错误日志中。
计算列
什么叫计算列?简单来说就是某一列的值是通过别的列计算得来的。例如:a列值为1、b列值为2,c列不需要手动插入,定于a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。
在MySQL8.0中,CREATE TABLE和ALTER TABLE都支持增加计算列。
语法:GENERATED ALWAYS AS (计算公式) VIRTUAL
宽度属性
从MySQL8.0.17开始,整数数据类型不推荐使用显示宽度的属性。
//创建表
CREATE TABLE tb1(
id INT,
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL
);
//插入数据
INSERT INTO tb1(a,b) VALUES (100,200);
//查询结果
mysql> SELECT * FROM tb1;
+------+------+------+------+
| id | a | b | c |
+------+------+------+------+
| NULL | 100 | 200 | 300 |
+------+------+------+------+
1 row in set (0.00 sec)
窗口函数
窗口函数的作用类似在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。
窗口函数可以分为
静态窗口函数
和动态窗口函数
静态窗口函数的窗口大小是固定的, 不会因为记录的不同而不同;
动态窗口函数的窗口大小会随着记录的不同而变化;
语法结构
窗口函数的语法结构是:
函数 OVER(PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC)
或者是:
函数 OVER 窗口名 ... WINDOW 窗口名 AS (PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC)
OVER的关键字指定函数的窗口范围。
如果省略后面括号中的内容,则窗口会包含满足WHERE条件的所有记录,窗口函数会基于所有满足WHERE条件的记录进行计算。
如果OVER关键字后面的括号不为空,则可以使用如下语法设置窗口。
窗口名:为窗口设置一个别名,用来标识窗口。
PARTITION BY子句:指定窗口函数按照哪些字段进行分组。分组后,窗口函数可以在每个分组中分别执行。
ORDER BY子句:指定窗口函数按照哪些字段进行排序。执行排序操作使窗口函数按照排序后的数据记录的顺序进行编号。
FRAME子句:为分区中的某个子集定义规则,可以用来作为滑动窗口使用。
窗口函数的特点是可以进行分组,而且可以在分组内排序。另外,窗口函数不会因为分组而减少表中的行数,这对我们在原表数据基础上进行统计和排序非常有用。
公用表表达式
公用表表达式(或通用表表达式)简称CTE(Common Table Expressions)。CTE是一个命名的临时结果集,作用范围是当前语句。CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询。所以,可以考虑代替子查询。
如果您打算在同一查询中重用子查询,则建议使用“公用表表达式”,因为该子查询被临时保存到内存中,这意味着它不需要多次运行。它们通常看起来也更干净,因此,如果您共享代码,则有助于提高可读性。
语法结构
WITH CTE名称
AS (子查询)
SELECT|DELETE|UPDATE 语句;
索引新特性
支持降序索引
降序索引以降序存储键值。虽然在语法上,从MySQL4版本开始就已经支持降序索引的语法了,但实际上该DESC定义是被忽略的,直到MySQL8.x版本才开始真正支持降序索引(仅限InnoDB存储引擎)。
MySQL在8.0版本之前创建的仍然是升序索引,使用时进行反向扫描,这大大降低了数据库的效率
。在某些场景下,降序索引意义重大。例如:如果一个查询,需要对多个列进行排序,且顺序要求不一致,那么使用降序索引将会避免数据库使用额外的文件排序操作,从而提高性能。
降序索引只对查询特定的排序顺序有效,如果使用不当,反而查询效率更低。
隐藏索引
在MySQL5.7版本之前,只能通过显式索引的方式删除索引。此时,如果发现删除索引后出现错误,又只能通过显式创建索引的方式将删除的索引创建回来。如果数据库表中的数据量非常大,或者数据表本身比较大,这种操作就会消耗系统过多的资源,操作成本非常高。
从MySQL8.0x开始支持隐藏索引(invisible indexes)
,只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使用force index(强制使用索引),优化器也不会使用该索引),确认将索引设置为隐藏索引后系统不受任何影响,就可以彻底删除索引。这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除
。
同时,如果你想验证某个索引删除之后的查询性能影响
,就可以暂时先隐藏该索引。
注意:主键不能被设置为隐藏索引。当表中没有显式主键时,表中第一个唯一非空索引将会成为隐式主键,也不能设置为隐藏索引。