这段时间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.)
分享到:
相关推荐
* 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...
在这个场景下,我们可以设置`max_length_for_sort_data = 16`,这样在排序过程中,sort_buffer只会存储`city`和`name`两列,而不再包含`age`列。然后,MySQL会进行两次回表查询:第一次按照`name`排序获取前1000行,...
- **增大`max_length_for_sort_data`**:如果返回字段长度总和小于`max_length_for_sort_data`,MySQL会使用单路排序,减少IO次数。但需注意,增大该参数可能导致内存使用增加。 - **调整`sort_buffer_size`**:...
如果单行数据过大,超过了`max_length_for_sort_data`参数设定的值,MySQL会改为使用rowid排序,只加载部分字段(如`name`和`id`)到sort_buffer,排序完成后,再根据rowid回表获取其他字段,这会增加额外的I/O开销...
为了优化文件排序,应确保只选取必要的列,并适当调整`sort_buffer_size`和`max_length_for_sort_data`参数,以平衡内存使用和I/O性能。 总之,理解并巧妙运用覆盖索引是优化MySQL查询性能的关键之一,它能够显著...
不过需要注意的是,GROUP_CONCAT的结果长度受到max_length_for_sort_data系统变量的限制,超出这个长度会被截断。你可以通过设置这个变量来提高其最大长度,但这也会影响排序操作的内存使用。 总的来说,GROUP_...
可以通过`max_length_for_sort_data`参数控制排序算法的选择。 **文件排序与临时表**:当ORDER BY仅涉及第一个表的列时,MySQL会在连接前进行文件排序,显示"Using filesort"。如果ORDER BY涉及多个表的列,MySQL会...
"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 ". $...
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...
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) / ...
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...
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...
data (cppstring) #define (preproc) difftime (stddate) div (stdmath) empty (cppdeque) empty (cpplist) empty (cppmap) empty (cppmultimap) empty (cppmultiset) empty (cpppriorityqueue) empty ...
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) 选择排序算法...
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+...