略微加速

略速 - 互联网笔记

MYSQL的文件排序(filesort)和索引排序

2020-11-16 leiting (4000阅读)

标签 MySql

什么时候会发生filesort 排序呢 
查询索引和order by 的字段不是同一个字段。比如 
select * from table where id > 0 order by name; 
注意:我们可以通知查询优化器按照我们的逻辑去执行索引,那么上面的sql如果我们调整为 
select * from table use index (idx_id) where id > 0 order by name; 
其中,idx_name是name的索引,那么查询索引和order by指的还是同一个字段,那么不会进行文件排序,而是索引排序。 
什么时候发生索引排序呢? 
查询索引和order by的字段是同一个字段。比如: 
select * from table where id > 0 order by id 
注意:这句话话不总是成立的,因为查询优化器会改写我们的查询sql,让我们的sql按照最优的方式执行,那么 
select * from table where id > 0 order by id 的查询按照我们的理解,应该会走索引,但是explain中显示的是filesort,因为这个时候,如果进行索引排序,那么每次顺序扫描下一条索引,就要回表,很多的随机I/O发生。 
但是 select id from table where id > 0 order by id 是走索引排序的。 
注意:Using where; Using temporary; Using filesort和Using where; Using temporary这两种情况的解说如下: 
Using where; Using temporary; Using filesort:表示进行关联查询时(mysql中关联查询的概念要更宽泛,不仅仅指两张表的关联才叫关联查询),使用了临时表,并在生成临时表后,又进行了文件排序; 
而Using where; Using temporary表示,仅仅生成了临时表,而没有进行文件排序(在生成临时表的时候已经排序完毕了)。

有人可能注意了:什么时候会Using temporary,比如group by 的时候就会创建临时表,而且group by 一定包含了排序,因此,当group by 字段和查询的字段和order by的字段都是同一个字段时,那么就会发生explain 的Extra列就会出现:Using where; Using temporary(使用了临时表,而且使用了索引排序,而不是文件排序(filesort))。


http://blog.csdn.net/kuaileshifu/article/details/49558599


北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3