如何确定最佳sort_buffer_size?


10

我从一个示例配置文件中读取内容,该文件显示以下内容:

# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.

我有几个使用filesort的查询。如何确定查询平稳运行而不需要打磁盘所需的缓冲区大小?


您是否运行过mysqltunerTuning -primer,您可能会在这些应用程序中看到有关my.cnf的有趣信息。
David Martinez 2014年

Answers:


14

只有一个状态变量在乎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 BYs和ORDER BYs进行查询,但是最好改进可以改进的查询并添加可以由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峰值。


2
这是更好的答案
Greg

7
@RolanoMySQLDBA可以在下面定义“很多”:“如果每秒看到许多Sort_merge_passes”
Tarek,

2

您无需更改默认的sort_buffer_size。您根据问题误解了它的用法。您应该首先检查SQL,以查看是否可以对其进行调整并使用索引满足ORDER BY / GROUP BY条件。它通常是一个综合索引。

进一步:http : //www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


抱歉地说,我发现该帖子几乎没有用。这就像告诉人们不要因为您不是专家而去做某事。如第一个注释者所指出的.cnf,mysql附带的示例文件不使用默认设置。
问题溢出

如果再次阅读它,则还表示专家已经知道不更改默认值。不应使用或引用示例.cnf文件作为良好实践。如果您需要构建my.cnf文件的帮助,Percona提供了一个相当全面的向导。tools.percona.com/wizard
eroomydna 2014年

2

手册(5.0-5.5)中的指南是

如果在SHOW GLOBAL STATUS输出中看到每秒有很多Sort_merge_passes,则可以考虑增加sort_buffer_size值来加快ORDER BY或GROUP BY操作,这些操作无法通过查询优化或改进的索引来改善。即使不是全部需要,也会分配整个缓冲区,因此将其设置为大于全局所需的大小将减慢大多数排序查询的速度。最好将其增加为会话设置,并且仅适用于需要更大大小的会话。在Linux上,阈值分别为256KB和2MB,其中较大的值可能会显着减慢内存分配,因此您应考虑保持低于这些值之一。尝试找到最适合您的工作量的价值。

从5.6开始,该措辞表示优化器可以为查询选择一个值,并且服务器可以将缓冲区扩展到最大限制。这样可以减少将值设置得太高的成本。因此,对于5.6.4以下的发行版,听起来您可能想要保守一些,低于默认值(如cnf发行版所做的那样),但可以承受更高的限制,比如说默认值为2MB,甚至更高,为5.6。 4,因为未盲目分配全部金额。

从MySQL 5.6.4开始,优化器尝试计算出需要多少空间,但是可以分配更多的空间,直到最大限制。


1

确定最佳值的最佳方法sort_buffer_size是对其进行基准测试。

怎么样?就像@RolandoMySQLDBA一样,检查Sort_merge_passes可能会有所帮助,但这不是影响性能的唯一因素。增加时应小心sort_buffer_size

该文件

在Linux上,阈值分别为256KB和2MB,其中较大的值可能会显着减慢内存分配,因此您应考虑保持低于这些值之一。

一篇关于测试的文章总结说

sort_merge_passes还不错 设置sort_buffer_size足够大以便为零sort_merge_passes可能不是最佳选择。

当我测试时,我也得到了类似的结果。

理想情况下,最好避免您需要优化的情况sort_buffer_size。怎么样?该ORDER BY Optimization文档可以帮助您了解事物的工作原理。


-1

““ mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;” 这是放置4m排序缓冲区大小的不好方法,那就是使排序缓冲区大小有4GB的使用量

“ mysql> SET GLOBAL sort_buffer_size = 1024 * 4;”

如果我是您,则不要尝试更改较短的缓冲区大小,这是使服务器崩溃并发送垃圾性能的好方法。最好尝试进行更好的查询。


1
4K排序缓冲区中如何进行大排序?请注意,您说过1024 * 4。那是4096、4K
RolandoMySQLDBA'5

罗兰多说了^^。最小允许值为32K。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.