文章目录

  • 学习资料
  • 常见的数据库管理系统排名(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:数据定义语言

CREATEALTERDROPRENAMETRUNCATE

DML:数据操作语言

INSERTDELETEUPDATESELECT

DCL:数据控制语言

COMMITROLLBACKSAVEPOINTGRANTREVOKE

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(强制使用索引),优化器也不会使用该索引),确认将索引设置为隐藏索引后系统不受任何影响,就可以彻底删除索引。这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除
同时,如果你想验证某个索引删除之后的查询性能影响,就可以暂时先隐藏该索引。
注意:主键不能被设置为隐藏索引。当表中没有显式主键时,表中第一个唯一非空索引将会成为隐式主键,也不能设置为隐藏索引。