2

问题:order by 排序字段会不会使用索引?

创建表结构

DROP TABLE IF EXISTS test.test;
CREATE TABLE test.test(
id int(10) not null auto_increment,
a int(10) not null,
b int(10) not null,
c int(10) not null,
PRIMARY key (`id`)
)ENGINE INNODB DEFAULT CHARSET utf8 COMMENT '测试表';

批量插入1000万条

mysql> explain select * from test order by b desc limit 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+
|  1 | SIMPLE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 9979716 |   100.00 | Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

现象:执行计划是全盘扫描

增加索引

mysql> ALTER TABLE test ADD INDEX idx_b (b);
Query OK, 0 rows affected (12.57 sec)

再次查询

mysql> explain select * from test order by b desc limit 10;
+----+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key   | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+-------+
|  1 | SIMPLE      | test  | NULL       | index | NULL          | idx_b | 4       | NULL |   10 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

现象:命中索引,执行计划只扫描10行
结论:order by后面的的字段需要创建索引。


山丘
4 声望0 粉丝