什么时候会发生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
最新评论: