`

max_length_for_sort_data

 
阅读更多

 这段时间mysql 数据库的性能明显降低,iowait达到了30, 响应时间明显变长.  通过show processlist 查看,发现有很多session在处理sort 操作, 跟DBA一起调试优化,增大sort_buffer_size 好象效果也不大, 通过查看监控,也没发现有硬盘排序. 我怀疑是sort导致性能下降,固让开发修改程序, sort由程序来处理. 星期五发布后,今天发现压力固然好了很多.

    因此基本上能确定是sort引起的问题. 今天仔细分析问题,查看mysql的参数时,看到一个叫做max_length_for_sort_data 的参数, 值是1024 仔细查看mysql 的filesort算法时, 发现mysql的filesort有两个方法,MySQL 4.1之前是使用方法A, 之后版本会使用改进的算法B, 但使用方法B的前提是列长度的值小于max_length_for_sort_data, 但我们系统中的列的长度的值会大于1024. 因此也就是说在sort的时候, 是在使用方法A, 而方法A的性能比较差, 也就解释了我们的mysql系统在有sort时,性能差,去掉之后性能马上提高很多的原因.

   马上修改max_length_for_sort_data这个值,增大到8096, 果然性能就提高了.

  总结:

    mysql对于排序,使用了两个变量来控制sort_buffer_size和  max_length_for_sort_data, 不象oracle使用SGA控制. 这种方式的缺点是要单独控制,容易出现排序性能问题.

 

   对于filesort的两个方法介绍,以及优化方式,见

http://forge.mysql.com/wiki/MySQL_Internals_Algorithms

 

Using the modified filesort algorithm, the tuples are longer than the pairs used in the original method, and fewer of them fit in the sort buffer (the size of which is given by sort_buffer_size). As a result, it is possible for the extra I/O to make the modified approach slower, not faster. To avoid a slowdown, the optimization is used only if the total size of the extra columns in the sort tuple does not exceed the value of the max_length_for_sort_data system variable. (A symptom of setting the value of this variable too high is that you should see high disk activity and low CPU activity.)

分享到:
评论

相关推荐

    MySQL8.0优化Hint-在SQL中修改会话变量.pdf

    * max_length_for_sort_data * max_points_in_geometry * max_seeks_for_key * max_sort_length * optimizer_prune_level * optimizer_search_depth * optimizer_switch * range_alloc_block_size * range_optimizer...

    16“order by”是怎么工作的?.pptx

    在这个场景下,我们可以设置`max_length_for_sort_data = 16`,这样在排序过程中,sort_buffer只会存储`city`和`name`两列,而不再包含`age`列。然后,MySQL会进行两次回表查询:第一次按照`name`排序获取前1000行,...

    MySQL order by性能优化方法实例

    - **增大`max_length_for_sort_data`**:如果返回字段长度总和小于`max_length_for_sort_data`,MySQL会使用单路排序,减少IO次数。但需注意,增大该参数可能导致内存使用增加。 - **调整`sort_buffer_size`**:...

    MySQL简单了解“order by”是怎么工作的

    如果单行数据过大,超过了`max_length_for_sort_data`参数设定的值,MySQL会改为使用rowid排序,只加载部分字段(如`name`和`id`)到sort_buffer,排序完成后,再根据rowid回表获取其他字段,这会增加额外的I/O开销...

    Mysql覆盖索引详解

    为了优化文件排序,应确保只选取必要的列,并适当调整`sort_buffer_size`和`max_length_for_sort_data`参数,以平衡内存使用和I/O性能。 总之,理解并巧妙运用覆盖索引是优化MySQL查询性能的关键之一,它能够显著...

    mysql中GROUP_CONCAT的使用方法实例分析

    不过需要注意的是,GROUP_CONCAT的结果长度受到max_length_for_sort_data系统变量的限制,超出这个长度会被截断。你可以通过设置这个变量来提高其最大长度,但这也会影响排序操作的内存使用。 总的来说,GROUP_...

    mysql中关于覆盖索引的知识点总结

    可以通过`max_length_for_sort_data`参数控制排序算法的选择。 **文件排序与临时表**:当ORDER BY仅涉及第一个表的列时,MySQL会在连接前进行文件排序,显示"Using filesort"。如果ORDER BY涉及多个表的列,MySQL会...

    ecmall插件

    "g.".$data['spe_data']['sort_order']." ".$data['spe_data']['asc_desc'] : "gst.".$data['spe_data']['sort_order']." ".$data['spe_data']['asc_desc']; } $con = array( 'conditions' => "1=1 ". $...

    linux下启动多个不同版本的mysql服务.docx

    datadir=/usr/local/mysql/data tmpdir=/tmp basedir=/usr/local/mysql skip-locking key_buffer=16M max_allowed_packet=1M table_cache=64 sort_buffer_size=512K net_buffer_length=16K myisam_sort_buffer_size=...

    各种排序 冒泡 快速 堆 希尔 基数等九种

    for (i=L.length/2; i>0; i--)// build the heap { Heap_Adjust(L,i,L.length); } for (i=L.length; i>1; i--) { L.r[0]=L.r[i];// 将 堆顶记录和当前未经排序子队列(1——i)中 的 最后一个记录 交换 L...

    C题:格拉布斯准则判断异常数据代码_格拉布斯准则_异常数据_

    sorted_data = sort(data); x_max = sorted_data(end); Z = (x_max - mu) / sigma; G = sqrt(n) * Z / (1 + (2 / (n - 1)) * Z^2); % 查找临界值 crit_val = norminv(1 - alpha/2, 0, 1) * sqrt((n - 1) / ...

    十大排序精炼总结(考研).pdf

    void count_sort(int *data, int length) { if (data == nullptr || length ) return; int max = data[0]; for (int i = 1; i < length; i++) { if (data[i] > max) max = data[i]; } int *countData = new...

    jquery需要的所有js文件

    a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter...

    c/c++函数库说明(api)html版

    data (cppstring) #define (preproc) difftime (stddate) div (stdmath) empty (cppdeque) empty (cpplist) empty (cppmap) empty (cppmultimap) empty (cppmultiset) empty (cpppriorityqueue) empty ...

    java排序

    for (int out = data.length - 1; out > 0; out--) { for (int in = 0; in ; in++) { if (data[in] > data[in + 1]) { swap(data, in, in + 1); } } } } ``` #### 选择排序(Selection Sort) 选择排序算法...

    hls.min.js

    return{key:e.type,data:n}},t._utf8ArrayToStr=function(t){for(var e=void 0,r=void 0,i="",a=0,n=t.length;a;){var o=t[a++];switch(o>>4){case 0:return i;case 1:case 2:case 3:case 4:case 5:case 6:case 7:i+...

Global site tag (gtag.js) - Google Analytics