技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> MySQL --> Mysql执行计划中的Using filesort

Mysql执行计划中的Using filesort

浏览:2283次  出处信息
MySQL需要额外的一次传递,以找出如何按排序顺序检索行,通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序,然后关键字被排序,并按排序顺序检索行(引文档)。

     额外的传递是指什么,反正每回不管看英文还是中文myql文档都是晕乎乎的。

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)

    1.只有order by时可能会出现using filesort

    2.order by b,如果b列不在索引中,不管b值是否相同,总会出现using filesort

3.并不是说所有的索引都可以避免using filesort,HEAP表的hash表索引是不按顺序来保存数据的
看来额外的传递也就是多做一次排序,我们不可能把所有字段都放到索引中,这么说出现using filesort也一定就会有性能问题。
注:

    possible_keys:指出MySQL可以使用哪个索引在该表中找到行

    key:显示MySQL实际决定使用的索引

    Using index:只从索引中检索数据,不回表

    key_len:显示MySQL决定使用的键长度

    rows:显示MySQL认为它执行查询时必须检查的行数

    ref:使用哪个列或常数与key一起从表中选择行。

建议继续学习:

  1. Filesort过程    (阅读:1534)
  2. 执行计划中常见index访问方式    (阅读:1488)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Mysql时间函数
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1