数据库优化<六>SQL优化之SELECT优化 ——filesort
来源:互联网 发布:windows怎样打日语 编辑:程序博客网 时间:2024/05/16 02:27
在执行计划中,可能经常看到有Extra列有filesort,这就是使用了文件排序,这当然是不好
的,应该优化,但是,了解一下他排序的原理也许很有帮助,下面看一下filesort的过程:
1、根据表的索引或者全表扫描,读取所有满足条件的记录
2、对与每一行,存储一对儿值到缓冲区,一个是排序的索引列的值,即order by用到
的列值,和执向该行数据的行指针,缓冲区的大小为sort_buffer_size大小
3、当缓冲区满后,运行一个快速排序(qsort)来将缓冲区中数据排序,并将排序完的
数据存储到一个临时文件,并 保存一个存储块儿的指针,当然,如果缓冲区不满,
则不会重建临时文件了
4、重复以上步骤,直到将所有行读完,并建立相应的有序的临时文件
5、对块级进行排序,这个类似与归并排序算法,只通过两个临时文件的指针来不断交换
数据,最终达到两个文件,都是有序的
6、重复5,直到所有的数据都排序完毕
7、采取顺序读的方式,将每行数据读入内存,并取出数据传到客户端,这里读取数据时
并不是一行一行读,读如缓存大小由read_rnd_buffer_size来指定
这就是filesort的过程,采取的方法为:快速排序 + 归并排序,但有一个问题,就是,一行数据会
被读两次,第一次是where条件过滤时,第二个是排完序后还得用行指针去读一次,一个优化的
方法是,直接读入数据,排序的时候也根据 这个排序,排序完成后,就直接发送到客户端了,
过程如下:
1、读取满足条件的记录
2、对于每一行,记录排序的key和数据行位置,并且把要查询的列也读出来
3、根据索引key排序
4、读取排序完成的文件,并直接根据数据位置读取数据返回客户端,而不是去访问表
这也有一个问题:当获取的列很多的时候,排序起来就很占空间,因此,max_length_for_sort_data
变量就决定了是否能使用这个排序算法
建议:
1、对于使用filesort的慢查询,可以改小一些max_length_for_sort_data来使用第一个方法
2、对于想要加快order by 的顺序,有以下一些策略:
a、增加sort_buffer_size的大小,如果大量的查询较小的话,这个很好,就缓存中就搞定了
b、增加read_rnd_buffer_size大小,可以一次性多读到内存中
c、列的长度尽量小些
d、改变tmpdir,使其指向多个物理盘(不是分区)的目录,这将机会循环使用做为临时文件区
- 数据库优化<六>SQL优化之SELECT优化 ——filesort
- 数据库优化<二>SQL优化之SELECT优化 ——mysql内部优化策略
- 数据库优化<五>SQL优化之SELECT优化 ——order by 优化
- 数据库优化<七>SQL优化之SELECT优化 ——group by 优化
- MySQL优化之filesort
- 数据库优化<八>SQL优化之SELECT优化 ——避免全表扫描
- 数据库优化<四>SQL优化之SELECT优化—mysql Innodb索引
- SQL(select)语句优化之六条
- mysql优化索引 —— Using filesort
- mysql优化索引 —— Using filesort
- 数据库优化<三>SQL优化之SELECT优化 ——JOIN和LEFT JOIN 和 RIGHT JOIN
- 数据库优化之sql优化
- mysql 优化(消除filesort)
- 数据库优化——常用SQL优化
- SQL优化 数据库优化
- sql优化,数据库优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- 数据结构与算法-“数组、链表、树、哈希表”选哪个
- C++赋值兼容规则和类类型转换注意事项之一
- poj 2135最小费用最大流
- Java中的容器
- php路径函数详解
- 数据库优化<六>SQL优化之SELECT优化 ——filesort
- js 银行卡4位中间一个空格
- 查看磁盘IO负载 - 看哪些进程在读写磁盘
- switch-case
- Java容器集合类的区别用法
- (09)项目中的位图索引误用
- maven环境快速搭建(一)
- 查看linux占用内存/CPU最多的进程
- weka文本分类