只有一个状态变量在乎sort_buffer_size。这就是问题后面的消息中的内容:Sort_merge_passes。MySQL文档说:
Sort_merge_passes:排序算法必须执行的合并通过次数。如果该值很大,则应考虑增加sort_buffer_size系统变量的值。
请记住有关sort_buffer_size的一件事
如果在SHOW GLOBAL STATUS输出中看到每秒很多Sort_merge_passes,则可以考虑增加sort_buffer_size值来加快ORDER BY或GROUP BY操作,这些操作无法通过查询优化或改进的索引来改善
虽然提高sort_buffer_size
可以帮助使用GROUP BY
s和ORDER BY
s进行查询,但是最好改进可以改进的查询并添加可以由Query Optimizer使用的索引。
问题仍然存在:如何检查Sort_merge_passes?
使用此代码,检查最近5分钟内发生了多少次Sort_merge_passes。它还计算每小时的Sort_merge_passes。
SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;
如果您发现Sort_merge_passes和速率太高,则可以随意增加sort_buffer_size。假设您想提高到4M。您将运行以下命令:
mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;
然后将其添加到my.cnf
[mysqld]
sort_buffer_size = 4M
您将定期运行代码以检查是否有其他时间Sort_merge_passes峰值。