当使用explain分析SQL时常常会遇到extra的其中一值为using
filesort,如:

PRIMARY KEY (`id`),

  KEY `uid` (`uid`)

explain select * from t_talbe where uid=1order by id;

extra结果为:Using
where; Using filesort

手册中对Using filesort解释是“MySQLmust
do an extra pass to find out how to retrieve the rows in sorted order. Thesort is done by going through all rows according to the join type and storingthe sort key and pointer to the row for all rows that match the WHERE clause.”。

假设根据条件会得到两条记录A(id1,uid1,*)和B(id2,uid2,*);根据KEY
`uid` (`uid`)排序规则,很容易得到这两条结果,找到的两个uid,即uid1和uid2,它们被检索出来的先(假如uid1)后(假如uid2)顺序已经知道了它们之间的大小关系,然而,id1和id2,谁大谁小呢?不知道。必须在它们之间进行比较,如果有n条结果集,必须对它们全部取出来比较,才能知道第一个记录是哪一个。第二个,……第n个呢?

现在先来了解一下index的一个思想,假设有“KEY
key_name(`k1`,`k2`,……,`kn`)”,我们知道记录集会:

1。先按照字段k1排序,

2。在k1相同的情况下,按k2排序,

3。在k2也相同的情况下,再按k3排序,依此类推,

4。最后是kn。

由此规则下可知,在一个队列Lx中,存在两个邻近的点Li(ki,1,ki,2,……,ki,n)和Li+1(ki+1,1,ki+1,2,……,ki+1,n),如果ki,1=ki+1,1,那么知道ki,2和ki+1,2在不需要比较的情况下就可以知道它们之间的关系。

所有针对以上的例子,把KEY `uid` (`uid`)修改成KEY
`u_id` (`uid`,`id`)可得以解决。

但,

例2。select
* from t_talbe where uid=1 order by id,uid;还是没办法,因为不可能建立INDEX
`u_id_u` (`uid`,`id`,`uid`);

例3。select
* from t_talbe where uid!=1 order by id;(possible_keys:u_f,uid;key:null;extra:Using
where; Using filesort。)

其中:uid=2(id|1,2,3,4),和uid=3(id|1,2,3,4),为了得到id的排序,对于`u_id`(`uid`,`id`)还得把所有记录取出来比较。

顺便说一下,有时候存在Using filesort,也未必是什么大不了的:如

例4。
select * from t_talbe order by id;只是告诉你它使用了“all
rows”。

为什么会存在using filesort的更多相关文章

  1. filesort是通过相应的排序算法

    filesort是通过相应的排序算法,将取得的数据在max_length_for_sort_data的默认值是1024. --------------------------------------- ...

  2. 在Mysql中Using filesort代表什么意思?

    在Mysql中使用explain来查看sql执行信息时,经常会看到Using filesort.那么Using filesort在MySQL中代表什么意思呢? 有人会说是外部排序,其实是不对或者不准确 ...

  3. filesort是什么意思?

    我们碰到有order by 或者group by,或者distinct语句的时候,如果查看执行计划,通常会看到using filesort的字眼,那么这个filesort是不是真是文件排序呢?其实不然 ...

  4. Mysql之EXPLAIN显示using filesort

    索引使用经验: 1. 一条 SQL 语句只能使用 1 个索引 (5.0-),MySQL 根据表的状态,选择一个它认为最好的索引用于优化查询 2. 联合索引,只能按从左到右的顺序依次使用 Using w ...

  5. order by优化--Order By实现原理分析和Filesort优化

    在MySQL中的ORDER BY有两种排序实现方式: 1.利用有序索引获取有序数据 2.文件排序 在使用explain分析查询的时候,利用有序索引获取有序数据显示Using index.而文件排序显示 ...

  6. 优化MYSQL FILESORT

    用Explain分析SQL语句的时候,经常发现有的语句在Extra列会出现Using filesort,根据mysql官方文档对他的描述: 引用 MySQL must do an extra pass ...

  7. MySQL filesort优化案例一则

    今天遇到一个filesort优化的案例,感觉不错,分享出来. MySQL中filesort是什么意思?官方手册定义: MySQL must do an extra pass to find out h ...

  8. 【MySQL】filesort.cc 源代码阅读笔记

    最近阅读了部分MySQL排序的代码,把心得记录一下. 参考代码 MySQL: 文件: filesort.cc 函数: filesort() 排序过程伪代码 function filesort(tabl ...

  9. mysql filesort 的解决方案

    在explain我们所使用的sql的时候,经常会遇到using filesort这种情况,原以为是由于有相同列值的原因引起,结果昨天看到公司的一个sql,跟同事讨论了下加上自己又做了一些测试,突然发现 ...

随机推荐

  1. 干货满满,腾讯云+社区技术沙龙 Kafka Meetup 深圳站圆满结束

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 云+导语:4月22日,由腾讯云和 Kafka 社区主办.开源中国协办的腾讯云+社区技术沙龙 Kafka Meetup 深圳站在腾讯大厦举行, ...

  2. hibernate5学习之理解数据库级并发

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50551741 当我们谈起隔离的时候,我们总是假定两个物体直接要么隔 ...

  3. Objective-C基础之简析深浅copy

    一.从面向对象到Objective-C概览copy 1.面向对象: In object-oriented programming, object copying is creating a copy ...

  4. Android艺术开发探索第四章——View的工作原理(下)

    Android艺术开发探索第四章--View的工作原理(下) 我们上篇BB了这么多,这篇就多多少少要来点实战了,上篇主席叫我多点自己的理解,那我就多点真诚,少点套路了,老司机,开车吧! 我们这一篇就扯 ...

  5. 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。

    比如{3,2,4,3,6} 可以分成 {3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2,4}{6} m=3 所以m的最大值为3. bool isShare(int* ...

  6. SublimeText3解决中文乱码

    1)安装Sublime Package Control.     在Sublime Text 3上用Ctrl+-打开控制台并在里面输入以下代码,Sublime Text 2就会自动安装Package ...

  7. spark运算结果写入hbase及优化

    在Spark中利用map-reduce或者spark sql分析了数据之后,我们需要将结果写入外部文件系统. 本文,以向Hbase中写数据,为例,说一下,Spark怎么向Hbase中写数据. 首先,需 ...

  8. [django] 利用多线程增加异步任务

    看到django异步大家的反应应该是celery这种消息队列组件,现在用的最多的最推荐的也是这种方式.然而我这需求就是请求来了,执行一个小程序,但是又不能确定这个小程序啥时候执行完,响应又要及时,丢给 ...

  9. 有n个数,输出其中所有和为s的k个数的组合。

    分析:此题有两个坑,一是这里的n个数是任意给定的,不一定是:1,2,3...n,所以可能有重复的数(如果有重复的数怎么处理?):二是不要求你输出所有和为s的全部组合,而只要求输出和为s的k个数的组合. ...

  10. 关于LT分发系统的设计构想

    git地址 https://github.com/cxyxd/LtDistribution 背景 对tomcat做集群,在多机多tomcat的情况下,如果要更新代码,只能手动的将代码复制,粘贴,然后下 ...