快捷搜索:
来自 网络数据库 2019-10-23 02:43 的文章
当前位置: 67677新澳门手机版 > 网络数据库 > 正文

新性格之降序索引

MySQL 8.0终于扶植降序索引了。其实,从语法上,MySQL 4就援助了,但正如官方文书档案所言,"they are parsed but ignored",实际成立的要么升序索引。

 

无图无精气神,同贰个建表语句,看看MySQL 5.7和8.0的分歧。

create table slowtech.t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc));

 

MySQL 5.7

mysql> show create table slowtech.t1G
*************************** 1. row ***************************
      Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  KEY `idx_c1_c2` (`c1`,`c2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

 

即使c2列钦命了desc,但在事实上的建表语句中依旧将其忽略了。再来看看MySQL 8.0的结果。 

 

mysql> show create table slowtech.t1G
*************************** 1. row ***************************
      Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  KEY `idx_c1_c2` (`c1`,`c2` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

c2列依旧保留了desc子句。

 

降序索引的含义

假若二个询问,须要对多少个列举办排序,且顺序供给差异等。在这里种气象下,要想防止数据库额外的排序-“filesort”,只可以利用降序索引。照旧地方那张表,来拜会有降序索引和未有的区分。

 

MySQL 5.7

mysql> explain select * from slowtech.t1 order by c1,c2 desc;
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ----------------------------- 
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra                      |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ----------------------------- 
|  1 | SIMPLE      | t1    | NULL      | index | NULL          | idx_c1_c2 | 10      | NULL |    1 |  100.00 | Using index; Using filesort |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ----------------------------- 
1 row in set, 1 warning (0.00 sec)

 

MySQL 8.0

mysql> explain select * from slowtech.t1 order by c1,c2 desc;
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra      |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
|  1 | SIMPLE      | t1    | NULL      | index | NULL          | idx_c1_c2 | 10      | NULL |    1 |  100.00 | Using index |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
1 row in set, 1 warning (0.00 sec)

 

互相的相比能够看见,MySQL 8.0因为降序索引的留存,防止了“filesort”。

 

那实则是降序索引的基本点使用场景。如果只对单个列进行排序,降序索引的含义不是太大,无论是升序依旧降序,升序索引完全能够应付。照旧同样的表,看看下边的询问。

 

MySQL 5.7

mysql> explain select * from slowtech.t1 order by c1;
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra      |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
|  1 | SIMPLE      | t1    | NULL      | index | NULL          | idx_c1_c2 | 10      | NULL |    1 |  100.00 | Using index |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from slowtech.t1 order by c1 desc;
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra      |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
|  1 | SIMPLE      | t1    | NULL      | index | NULL          | idx_c1_c2 | 10      | NULL |    1 |  100.00 | Using index |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
1 row in set, 1 warning (0.00 sec)

 

即使c1是升序索引,但在第二个查询中,对其张开降序排列时,并从未举办额外的排序,使用的要么索引。在这里间,我们轻易发生误区,以为升序索引就无法用于降序排列,实际上,对于索引,MySQL不只有援助正向扫描,还能反向扫描。反向扫描的性情相仿不差。以下是官方对于降序索引的压测结果,测量检验表也只有两列(a,b),建了二个同步索引(a desc,b asc),感兴趣的童鞋能够看看,http://mysqlserverteam.com/mysql-8-0-labs-descending-indexes-in-mysql/,感兴趣的童鞋可以看看,)

 

图片 1

而在8.0中,对于反向扫描,有五个特地的词进行描述“Backward index scan”。

 

MySQL 8.0

mysql> explain select * from slowtech.t1 order by c1;
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra      |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
|  1 | SIMPLE      | t1    | NULL      | index | NULL          | idx_c1_c2 | 10      | NULL |    1 |  100.00 | Using index |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ------------- 
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from slowtech.t1 order by c1 desc;
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ---------------------------------- 
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra                            |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ---------------------------------- 
|  1 | SIMPLE      | t1    | NULL      | index | NULL          | idx_c1_c2 | 10      | NULL |    1 |  100.00 | Backward index scan; Using index |
 ---- ------------- ------- ------------ ------- --------------- ----------- --------- ------ ------ ---------- ---------------------------------- 
1 row in set, 1 warning (0.00 sec)

 

好不轻巧不再对group by举办隐式排序

由于降序索引的引入,MySQL 8.0再也不会对group by操作进行隐式排序。

下边看看MySQL 5.7和第88中学的测验景况

 

 

create table slowtech.t1(id int);
insert into slowtech.t1 values(2);
insert into slowtech.t1 values(3);
insert into slowtech.t1 values(1);

 

MySQL 5.7

mysql> select * from slowtech.t1 group by id;
 ------ 
| id  |
 ------ 
|    1 |
|    2 |
|    3 |
 ------ 
3 rows in set (0.00 sec)

mysql> explain select * from slowtech.t1 group by id;
 ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- --------------------------------- 
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                          |
 ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- --------------------------------- 
|  1 | SIMPLE      | t1    | NULL      | ALL  | NULL          | NULL | NULL    | NULL |    3 |  100.00 | Using temporary; Using filesort |
 ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- --------------------------------- 
1 row in set, 1 warning (0.00 sec)

“Using filesort”,代表询问中有排序操作,从结果上看,id列确实也是升序输出。

 

MySQL 8.0

mysql> select * from slowtech.t1 group by id;
 ------ 
| id  |
 ------ 
|    2 |
|    3 |
|    1 |
 ------ 
3 rows in set (0.00 sec)

mysql> explain select * from slowtech.t1 group by id;
 ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- ----------------- 
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
 ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- ----------------- 
|  1 | SIMPLE      | t1    | NULL      | ALL  | NULL          | NULL | NULL    | NULL |    3 |  100.00 | Using temporary |
 ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- ----------------- 
1 row in set, 1 warning (0.01 sec)

岂但结果未有升序输出,施行布署中也一贯不“Using filesort”。

看得出,MySQL 8.0对于group by操作确实不再进行隐式排序。

从5.7升任到8.0,信赖group by隐式排序的政工可要小心咯。

 

参照文档

http://mysqlserverteam.com/mysql-8-0-labs-descending-indexes-in-mysql/

 

 

 

本文由67677新澳门手机版发布于网络数据库,转载请注明出处:新性格之降序索引

关键词: