mysql using filesort_Mysql执行计划中的Using filesort

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可以使用哪个索引在该表中找到行

觉得文章有用?立即:

和朋友一起 共学习 共进步!

猜您喜欢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值