MySQL8.0新特性

文章目录

      • 优化器索引
      • 窗口函数
      • InnoDB增强
      • 账号与安全
      • 通用表表达式
      • JSON增强

优化器索引

① 隐藏索引

隐藏索引不会被优化器使用,但它仍然需要进行维护
主要应用于软删除(先将索引隐藏,当最终确认系统不会受到影响才将其彻底删除)、灰度发布(为了测试某些功能先将索引隐藏,经测试索引有效才将其设置为可见)等场景。
mysql> show index from tableName;

② 降序索引
MySQL8.0之前,索引也可以反向扫描来实现降序效果,但会有一定的性能损耗。利用降序索引可以进行更高效的正向扫描。降序索引使得优化器能够同时使用不同列上的升序方向和降序降序方向索引。

例如:
CREATE TABLE t (
c1 INT, c2 INT,
INDEX idx1 (c1 ASC, c2 ASC),
INDEX idx2 (c1 ASC, c2 DESC),
INDEX idx3 (c1 DESC, c2 ASC),
INDEX idx4 (c1 DESC, c2 DESC)
);
优化器可以为ORDER BY子句进行正向索引扫描排序而不用性能较差的filesort排序:

ORDER BY c1 ASC, c2 ASC – optimizer can use idx1
ORDER BY c1 DESC, c2 DESC – optimizer can use idx4
ORDER BY c1 ASC, c2 DESC – optimizer can use idx2
ORDER BY c1 DESC, c2 ASC – optimizer can use idx3

只有InnoDB引擎索引支持降序索引,且只支持BTREE降序索引。

③ 函数索引

MySQL 8.0支持函数索引(functional key parts),也就是可以将表达式的值作为索引的内容,而不只是列值或列值前缀。 将函数作为索引键可以用于索引那些没有在表中直接存储的内容。例如:

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);

  • 支持降序索引,支持JSON数据的索引
  • 函数索引的实现是基于虚拟列功能实现
    (e.g. alter table t22 add column c3 varchar(64) generated always as (upper(c1)))

窗口函数

按照功能划分,可以把MySQL支持的窗口函数分为如下几类:

  • 序号函数:row_number() / rank() / dense_rank()

  • 分布函数:percent_rank() / cume_dist()

  • 前后函数:lag() / lead()

  • 头尾函数:first_val() / last_val()

  • 其他函数:nth_value() / nfile()

函数名([expr]) over子句

其中,over是关键字,用来指定函数执行的窗口范围,如果后面括号中什么都不写,则意味着窗口包含满足where条件的所有行,窗口函数基于所有行进行计算;如果不为空,则支持以下四种语法来设置窗口:

window_name:给窗口指定一个别名,如果SQL中涉及的窗口较多,采用别名可以看起来更清晰易读。上面例子中如果指定一个别名w,则改写如下:

select * from
(

select row_number() over w as row_num,

order_id,user_no,amount,create_date

from order_tab

WINDOW w AS (partition by user_no order by amount desc)

) t ;

partition子句:窗口按照那些字段进行分组,窗口函数在不同的分组上分别执行。上面的例子就按照用户id进行了分组。在每个用户id上,按照order by的顺序分别生成从1开始的顺序编号。

order by子句:按照哪些字段进行排序,窗口函数将按照排序后的记录顺序进行编号。可以和partition子句配合使用,也可以单独使用。上例中二者同时使用,如果没有partition子句,则会按照所有用户的订单金额排序来生成序号。

frame子句:frame是当前分区的一个子集,子句用来定义子集的规则,通常用来作为滑动窗口使用。
MySQL8.0新特性_第1张图片
MySQL8.0新特性_第2张图片

InnoDB增强

  • 集成数据字典

    • 删除了之前版本的元数据文件,如 .frm, .opt等
    • 将系统表(mysql库中的表)和数据字典表(information_schema、performance_schema等库中的表)全部改为innodb引擎(存放在.ibd文件中,可使用ibd2sdi工具查看)
      下面来看下在MySQL8.0之前和MySQL8.0 数据字典的区别
    • MySQL8.0新特性_第3张图片
    • MySQL8.0新特性_第4张图片
      在MySQL8.0 之前,Data Dictionary除了存在与.FRM, .TRG, .OPT 文件外,还存在于系统表中(MyISAM 非事务引擎表中),在MySQL8.0 ,Data Dictionary 全部存在于Data Dictionary Storage Engine(即 InnoDB表中),这使crash recovery 维持原子性成为了可能
  • 支持原子DDL语句

    • MySQL8.0 开始支持原子 DDL(atomic DDL),数据字典的更新,存储引擎操作,写二进制日志结合成了一个事务。在没有原子DDL之前,DROP TABLE test1,test2;如遇到server crash,可能会有test1被drop了,test2没有被drop掉。
  • 自增列持久化
    MySQL8.0新特性_第5张图片

  • 死锁检查控制
    MySQL8.0新特性_第6张图片

  • 锁定语句NOWAIT、SKIP LOCKED选项
    MySQL8.0新特性_第7张图片

  • 其他改进功能
    MySQL8.0新特性_第8张图片
    MySQL8.0新特性_第9张图片
    MySQL8.0新特性_第10张图片

账号与安全

① 创建用户和用户授权的命令需要分开执行:
mysql> create user ‘tony’@’%’ identified by ‘Tony@2018’;
mysql> grant all privileges on . to ‘tony’@’%’;

② 认证插件的更新
mysql8.0中默认的身份认证插件是:
caching_sha2_password 替代了之前的 mysql_native_password
适配旧的客户端两个方法:
1、通过修改配置文件中default-authentication-plugin=mysql_native_password
2、修改mysql.user表
alter user ‘xxx’@’%’ identified with mysql_native_password by ‘xxxxxxxx’

③ 密码管理
password_history = 3 ; 新密码不能和前面三次的密码相同
password_reuse_interval = 90 ; 新密码不能和前面九十天内使用的密码相同
password_require_current = on ; 默认为off;为on时 修改密码需要用户提供当前密码
mysql> set persist xxxx=bbb , 使用set persist可以使设置的配置永久生效

④ 角色管理
MySQL8.0新特性_第11张图片

通用表表达式

① 非递归CTE

  1. 定义一个CTE
    WITH cte1(id) as (SELECT 1), cte2(id) as (select id + 1 from cte1);
  2. 直接使用cte:
    SELECT id FROM cte2;

② 递归CTE

WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
1
union
2
union
3
union
4
union
5

③ 递归限制

限制递归次数的参数:cte_max_recursion_depth=1001
限制sql最长执行时间: max_execution_time=0 (0表示无限制)

JSON增强

  • 内联路径操作符
    MySQL8.0新特性_第12张图片
    e.g.
    MySQL8.0新特性_第13张图片
  • JSON聚合函数
    MySQL8.0新特性_第14张图片
    e.g.
    MySQL8.0新特性_第15张图片
  • JSON实用函数
    MySQL8.0新特性_第16张图片
  • JSON合并函数
    MySQL8.0新特性_第17张图片
    MySQL8.0新特性_第18张图片
  • JSON表函数
    MySQL8.0新特性_第19张图片
    MySQL8.0新特性_第20张图片

你可能感兴趣的:(数据库)