增加mysql的sortbuffer_mysql sort 性能优化

这段时间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的两个方法介绍,以及优化方式,见

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 bysort_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 themax_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.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 中,当使用 ORDER BY 或 GROUP BY 语句进行排序时,会在磁盘上创建临时文件进行排序,这个过程称为 filesort。为了优化 filesort 的性能,MySQL 提供了 sort_buffer_size 和 max_length_for_sort_data 两个参数。 sort_buffer_size 参数定义了 MySQL 用于排序的缓冲区大小。默认值为 2MB。如果排序操作需要的内存超过了 sort_buffer_size,MySQL 将使用磁盘上的临时文件进行排序。因此,增大 sort_buffer_size 可以减少磁盘 I/O,提高排序性能。但是,如果 sort_buffer_size 设置过大,会导致内存占用过多,可能会影响其他操作的性能。 innodb_sort_buffer_size 参数用于指定 InnoDB 存储引擎排序时使用的缓冲区大小。该参数默认值为 1MB。与 sort_buffer_size 类似,增大 innodb_sort_buffer_size 可以提高排序性能,减少磁盘 I/O。 为了优化 filesort 的性能,可以按照以下步骤进行调优: 1. 使用 EXPLAIN 命令查看查询执行计划,检查是否使用了 filesort。 2. 如果使用了 filesort,可以尝试增大 sort_buffer_size 和 innodb_sort_buffer_size 参数的值。 3. 如果增大缓冲区大小仍然无法解决问题,可以考虑优化查询语句,减少排序操作。 4. 如果无法通过查询语句优化解决问题,可以考虑增加服务器的物理内存。 需要注意的是,增大缓冲区大小并不是解决所有排序性能问题的万能方法。在实际应用中,需要根据具体情况进行调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值