Using filsort文档中的解释:
Mysql需要额外的一次传递,以找出如何按排序顺序检索行,通过根据联接类型浏览所有行并为所有匹配where子句的行保存排序关键字和行的指针来完成排序,然后关键字被排序,并按排序顺序检索行。额外的传递是指什么?
Mysql> show create table test_filesort\G;
*************************** 1. row ***************************
Table: test_filesort
Create Table: CREATE TABLE `test_filesort` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
KEY `a_2` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
Mysql> explain select * from test_filesort where a=1 order by b;
+—-+————-+—————+——+—————+——+———+——-+——+—————————–+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+—————+——+—————+——+———+——-+——+—————————–+
| 1 | SIMPLE | test_filesort | ref | a_2 | a_2 | 5 | const | 1 | Using where; Using filesort |
+—-+————-+—————+——+—————+——+———+——-+——+—————————–+
1 row in set (0.00 sec)
Mysql> alter table test_filesort add index(a,b);
Query OK, 6 rows affected (0.04 sec)
Records: 6 Duplicates: 0 Warnings: 0
Mysql> explain select * from test_filesort where a=1 order by b;
+—-+————-+—————+——+—————+——+———+——-+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+—————+——+—————+——+———+——-+——+————-+
| 1 | SIMPLE | test_filesort | ref | a_2,a | a | 5 | const | 1 | Using where |
+—-+————-+—————+——+—————+——+———+——-+——+————-+
1 row in set (0.00 sec)
额外传递指的是多做了一次排序,很少人会把所有需要排序的字段都放到索引中,出现Using filesort不一定就会有什么性能问题。当然,我是希望尽量在应用中实现order by排序,如果放在数据库这边实现,查询次数又非常大的话,尽量考虑把字段直接冗余到索引中去,避免Mysql自身的排序机制可能会引起的性能下降。
1.order by时可能会出现Using filesort。
2.order by b,如果b列不在索引中,不管b值是否相同,总会出现Using filesort。
3.并不是说所有的索引都可以避免Using filesort,hash索引是不按顺序来保存数据的。
注:
key:显示Mysql实际决定使用的索引
Using index:只从索引中检索数据,不回表
key_len:显示Mysql决定使用的键长度
rows:显示Mysql认为它执行查询时必须检查的行数
ref:使用哪个列或常数与key一起从表中选择行
possible_keys:指出Mysql可以使用哪个索引在该表中找到行
觉得文章有用?立即:
和朋友一起 共学习 共进步!