五、MySQL8的新特性

96 阅读3分钟

MySQL8的新特性

隐藏索引

MySQL8支持隐藏索引,可以把某个索引设置成对优化器不可见,这样在sql语句执行时就不会用到这个索引。

平时在测试的时候,可以将索引设置成隐藏或者非隐藏,依次来测试索引带来的效果。

隐藏索引的sql:

将索引设置成隐藏索引:alter table xxx alter index xxx invisible;

将索引设置成非隐藏索引:alter table xxx alter index xxx visible;

降序索引

在MySQL中,创建索引时,可以在索引后面加asc或者desc,这样在查询的时候按照索引列排序时可以提高效率。

但是,在MySQL5.x版本,创建联合索引,一个索引指明asc,另一个索引指明desc后,使用联合索引进行排序会有一个问题,只要联合索引一个索引列是asc排序,另一个是desc排序,索引会失效,直接走filesort,效率就会很差。

image.png

image.png

MySQL8的改进:

在MySQL8中,为了解决这个问题,支持了降序索引。当使用联合索引进行排序,即使一个是索引列是asc排序,另一个是desc排序,依然会使用索引,效率很高。

image.png

但是MySQL8也有一个问题,就是使用联合索引时,如果两个索引列都是asc或者desc,索引会失效。

image.png

要解决这个问题,可以再创建个联合索引,并且使用相同的索引列,不过索引列的排序需要都是asc或者desc。

相同的列上创建多个联合索引是被允许的。

函数索引

在MySQL8中,可以指定一个函数作为索引。其原理是在表中新增了一列,这一列是函数的值,将这一列作为索引列。

image.png

image.png

以上是创建了UPPER(c2)的函数索引,这个函数是将c2列中所有值变成大写

image.png

通用表表达式

通用表表达式可以通过递归得到想要的数据

通用表达式的语法如下:

with recursive cte(n) as
( select 1
  union all
  select n+1 from cte where n < 10
)
select * from cte;

recursive是通用表表达式的标识,cte是通用表表达式生成的衍生表,as后面的小括号部分是衍生表数据生成的过程。

首先执行select 1,得到1,这个1会作为cte衍生表的第一行数据。然后将1作为入参,传给cte(n),再去执行 select n+1 from cte where n < 10。首先判断n是否小于10,满足的情况下,将n+1后,得到的结果作为cte衍生表的第二行数据。再将结果传给cte(n),不断的循环执行,直到n不小于10为止。

cte这个衍生表中记录了所有的计算得到的数据。

窗口函数

窗口函数的语法是:

窗口函数() over (
    [partition by ...]
    [order by ....]
    [窗口大小]
)

其中窗口函数有以下几种:

image.png

partition by是指明窗口函数作用的分区,order by是对结果进行排序,窗口大小是指定窗口函数作用的范围。

窗口函数与聚合函数一个很大的不同是,窗口函数会在查询出来的每一条记录后面都会添加上结果,而聚合函数的结果只能有一条数据。

以下是一个最简单的窗口函数实例:

image.png

image.png