1.简要说明

   在sql中常常用到order by,排序对于sql的查询速度有较大的的影响。mysql支持两种排序方式,FileSort和Index,Index效率高,它指MySQL扫描索引本身完成排序。FileSort方式效率较低。

  所以在ORDER BY子句中,尽量使用Index方式排序,避免使用FileSort方式排序

2.FileSort的算法
2.1双路排序

  MySQL 4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,读取行指针和orderby列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出。从磁盘取排序字段,在buffer进行排序,再从磁盘取其他字段。多路排序需要借助 磁盘来进行排序。所以取数据,排好了取数据。两次 io操作。比较慢

2.2单路排序

  从磁盘读取查询需要的所有列,按照order by列在buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。
  在sort_buffer中,单路排序比双路排序要多占用很多空间,因为双路排序是把所有字段都取出, 所以有可能取出的数据的总大小超出了sort_buffer的容量,导致每次只能取sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排完再取sort_buffer容量大小,再排……从而多次I/O。

3.在什么情况下会使用index排序

1)ORDER BY 语句使用索引最左前列

2)使用Where子句与Order BY子句条件列组合满足索引最左前列

where子句中如果出现索引的范围查询(即explain中出现range)会导致order by 索引失效。

4.优化策略

4.1 Order by时select * 是一个大忌,只Query需要的字段, 这点非常重要
  1 )当Query的字段大小总和小于max_length_for_sort_data 而且排序字段不是 TEXT|BLOB 类型时,会用改进后的算法——单路排序, 否则用老算法——多路排序。
  2 )两种算法的数据都有可能超出sort_buffer的容量,超出之后,会创建tmp文件进行合并排序,导致多次I/O,但是用单路排序算法的风险会更大一些,所以要提高sort_buffer_size。

4.2 尝试提高 sort_buffer_size
不管用哪种算法,提高这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的。一般由数据库管理员进行调整。

4.3 尝试提高 max_length_for_sort_data
提高这个参数, 会增加用改进算法的概率。但是如果设的太高,数据总容量超出sort_buffer_size的概率就增大,明显症状是高的磁盘I/O活动和低的处理器使用率。 一般由数据库管理员进行调整。

5.GROUP BY

group by实质是先排序后进行分组,遵照索引建的最佳左前缀。group by和order差不多

6.使用主键驱动优化

explain select sex from abilityassessrecord ORDER BY customerno LIMIT 10,10

type是all,而且使用了filesort

改成下面的写法,先只查询主键recordno,再连接查询需要的字段

explain SELECT sex from abilityassessrecord a,
((select recordno from abilityassessrecord ORDER BY customerno LIMIT 10,10)b) WHERE a.recordno = b.recordno

最新文章

  1. iOS 学习 - 22 异步解析 JSON,使用 FMDB 存储,TableView 显示
  2. 03-c#入门(简易存款利息计算器v1.0)
  3. linux命令行下的ftp 多文件下载和目录下载
  4. oracle分页查询sql
  5. IE取消访问剪贴板设置
  6. Android-补间动画效果
  7. J2EE 基础知识积累
  8. hitTest:withEvent:方法(此方法可实现点击穿透、点击下层视图功能)
  9. Dearmweaver CS6 如何添加emmet 插件
  10. 浅析ArrayList,LinkedList的执行效率
  11. Spring HTTPInvoker原理猜想(HTTP+序列化)
  12. 策略模式Strategy——坐什么车回家?
  13. XML 树结构
  14. 安装了C
  15. Dojo初探之4:dojo的event(鼠标/键盘)事件绑定操作(基于dojo1.11.2版本)
  16. git常用命令,助你快速入门
  17. C#执行批处理命令
  18. ItunesConnect:"Missing Push Notification Entitlement"警告-----以及解决方法
  19. Pandas逐行读取Dateframe并转为list
  20. utils工具类

热门文章

  1. ironic组件硬件自检服务——ironic-inspector
  2. 【云原生 · Kubernetes】部署kube-apiserver集群
  3. Android网络请求(终) 网络请求框架Retrofit
  4. 1. PyQt5开发环境的搭建
  5. 5V降压转3.3V,5V转3V电路图芯片
  6. 【JUC】循环屏障CyclicBarrier详解
  7. SpringBoot中搭配AOP实现自定义注解
  8. RequestMappingHandlerMapping请求地址映射流程!
  9. 常用的渗透测试工具——SQLMap安装
  10. 从源码层面深度剖析Spring循环依赖