阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 916|回复: 0

[转帖] Mysql执行计划中的Using filesort

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-1-31 10:59:35 | 显示全部楼层 |阅读模式
    Using filsort文档中的解释:
    Mysql需要额外的一次传递,以找出如何按排序顺序检索行,通过根据联接类型浏览所有行并为所有匹配where子句的行保存排序关键字和行的指针来完成排序,然后关键字被排序,并按排序顺序检索行。额外的传递是指什么?

    Mysql> show create table test_filesortG;
    *************************** 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可以使用哪个索引在该表中找到行




    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表