乐趣区

mysql中order by 使用索引问题

问题: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 后面的的字段需要创建索引。

退出移动版