您的位置:首页 > 数据库 > MySQL

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

2015-11-01 15:30 1021 查看
什么时候会发生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))。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: