设为首页 加入收藏

TOP

mysql中的order by(二)
2015-11-21 01:38:39 来源: 作者: 【 】 浏览:1
Tags:mysql order
Y 操作的效率尽可能的高,需要注意max_length_for_sort_data参数的设置。
?
3、使用Using temporary 临时表来filesort
?
如果order by的子句只引用了联接中的第一个表,MySQL会先对第一个表进行排序,然后进行联接,expain中的Extra会出现Using Filesort
?
否则MySQL先把结果保存到临时表(Temporary Table),然后再对临时表的数据进行排序,此时expain中的Extra的显示Using temporary Using Filesort
?
4、Join排序
?
mysql中有三种方式
?
1)、Use index-based access method that produces ordered output  -》 null
?
?
2)、Use filesort() on 1st non-constant table -》 “Using filesort” in the first row
?
?
3)、Put join result into a temporary table and use filesort() on it ? -》 ?“Using temporary; Using filesort” in the first row
?
5、说一下filesort,可以参考 What does Using filesort mean in MySQL?
?
摘自原文
?
?
?
The truth is, filesort is badly named. Anytime a sort can’t be performed from an index, it’s a filesort. It has nothing to do with files. Filesort should be called “sort.” It is quicksort at heart.
?
?
?
If the sort is bigger than the sort buffer, it is performed a bit at a time, and then the chunks are merge-sorted to produce the final sorted output. There is a lot more to it than this. I refer you to Sergey Petrunia’s article on How MySQL executes ORDER BY. You can also read about it in our book, but if you read Sergey’s article you won’t need to.
?
?
?
这里有一个误区,容易望文生义,Explain 命令输出信息中的 filesort 到底是什么意思呢?其实很简单,就是告诉你 MySQL 需要进行实际的排序操作而不能通过索引获得已排序数据
?
?
?
1)、filesort(其实就是排序) 可不一定会产生临时表
?
2)、filesort 与临时表数据写入磁盘是没有任何直接联系的
?
?
二 、优化order by
?
当无法避免排序操作时,又该如何来优化呢?很显然,优先选择第一种using index 的排序方式,在第一种方式无法满足的情况下,尽可能让 MySQL 选择使用第二种单路算法来进行排序。这样可以减少大量的随机IO操作,很大幅度地提高排序工作的效率。
?
1、加大 max_length_for_sort_data 参数的设置
?
在 MySQL 中,决定使用老式排序算法还是改进版排序算法是通过参数 max_length_for_ sort_data 来决定的。当所有返回字段的最大长度小于这个参数值时,MySQL 就会选择改进后的排序算法,反之,则选择老式的算法。所以,如果有充足的内存让MySQL 存放须要返回的非排序字段,就可以加大这个参数的值来让 MySQL 选择使用改进版的排序算法。
?
2、去掉不必要的返回字段
?
当内存不是很充裕时,不能简单地通过强行加大上面的参数来强迫 MySQL 去使用改进版的排序算法,否则可能会造成 MySQL 不得不将数据分成很多段,然后进行排序,这样可能会得不偿失。此时就须要去掉不必要的返回字段,让返回结果长度适应 max_length_for_sort_data 参数的限制。
?
3 增大 sort_buffer_size 参数设置
?
这个值如果过小的话,再加上你一次返回的条数过多,那么很可能就会分很多次进行排序,然后最后将每次的排序结果再串联起来,这样就会更慢,增大 sort_buffer_size 并不是为了让 MySQL选择改进版的排序算法,而是为了让MySQL尽量减少在排序过程中对须要排序的数据进行分段,因为分段会造成 MySQL 不得不使用临时表来进行交换排序。
?
但是这个值不是越大越好:
?
1 Sort_Buffer_Size 是一个connection级参数,在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存。
?
2 Sort_Buffer_Size 并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。
?
3 据说Sort_Buffer_Size 超过2M的时候,就会使用mmap() 而不是 malloc() 来进行内存分配,导致效率降低。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇PHPClientforMysqlBinlog 下一篇MySQL中ROUND和TRUNCATE的区别

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: