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))。
查询索引和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))。
相关文章推荐
- Mysql学习笔记一, 安装Mysql,简单命令学习
- Mysql:is not allowed to connect to this MySQL server
- MYSQL中string的常用函数
- MYSQL查询SQL的注意事项和一些技巧总结
- mysql 基本操作
- mysql 导入导出
- MySQL建表时,PK.NN.UQ.AI.BIN.ZF的含义
- mysql主从同步配置
- MySQL数据库开发与优化视频
- MYSQL-复制
- ubuntu15.04 mysql5.6.27编码格式配置
- mac mysql客户端操作mysql
- Mysql参见SHOW命令总结
- mysql读写分离的实现之amoeba
- MySQL 数据库常用命令小结
- mysql 学习记录(十九)--Innodb表锁
- mysql字符串查询大小写问题
- mysql基础0之配置
- mysql AUTO_INCREMENT
- c# + Maticsoft.DBUtility+ mysql 做winform的遇到的一些问题及处理