什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集。

我们通常使用下面的语句来创建一个索引:

信用盘源码搭建出售q-1152880099

create index idx\_t1\_bcd on t1(b,c,d); 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引。


但是大家不知道的是,上面这个sql实际上和下面的这个sql是等价的:

create index idx\_t1\_bcd on t1(b asc,c asc,d asc); asc表示的是升序,使用这种语法创建出来的索引叫做升序索引。也就是我们平时在创建索引的时候,创建的都是升序索引。

可能你会想到,在创建的索引的时候,可以针对字段设置asc,那是不是也可以设置desc呢?

当然是可以的,比如下面三个语句:

create index idx\_t1\_bcd on t1(b desc,c desc,d desc); create index idx\_t1\_bcd on t1(b asc,c desc,d desc); create index idx\_t1\_bcd on t1(b asc,c asc,d desc); 这种语法在mysql中也是支持的,使用这种语法创建出来的索引就叫降序索引,关键问题是:在Mysql8.0之前仅仅只是语法层面的支持,底层并没有真正支持。

我们分别使用Mysql7、Mysql8两个版本来举例子说明一下:

在Mysql7、Mysql8中分别创建一个表,有a,b,c,d,e五个字段:

create table t1 ( a int primary key, b int, c int, d int, e varchar(20) ) engine=InnoDB; 然后分别创建一个降序索引:

create index idx\_t1\_bcd on t1(b desc,c desc,d desc); 创建成功后,我们使用以下sql查看一下索引信息:

show index from t1; Mysql7中你将得到结果:

MySQL 8 新特性之降序索引底层实现

Mysql8中你将得到结果:

MySQL 8 新特性之降序索引底层实现

我们只关心Key\_name为idx\_t1\_bcd的三行记录,细心的你应该可以发现,这两个结果中的Collation字段的结果是不一样的:

在Mysql7中,Collation字段的结果为A,A,A,表示b,c,d三个字段的排序方式是asc 在Mysql8中,Collation字段的结果为D,D,D,表示b,c,d三个字段的排序方式是desc 但是我们在创建索引的时候,明明在语法层面已经指定了b,c,d三个字段的排序方式是desc,这就可以看出来在Mysql7中降序索引只是语法层面的支持,底层并没有真正支持,并且固定是升序索引。而在Mysql8中则真正从底层支持了降序索引。

到此为止,大家应该对升序索引和降序索引有了一个大概的了解,但并没有真正理解,因为大家并不知道升序索引与降序索引底层到底是如何实现的。

标签: index, 源码, MySQL, 索引, desc, t1, asc, 降序

相关文章推荐

添加新评论,含*的栏目为必填