如何确定最佳sort_buffer_size?

Que*_*low 13 mysql myisam mariadb tuning sorting

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

# 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.
Run Code Online (Sandbox Code Playgroud)

我有几个使用文件排序的查询。如何确定查询在不碰到磁盘的情况下顺利运行所需的缓冲区大小是多少?

Rol*_*DBA 19

只有一个状态变量关心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 进行查询,但最好改进可以改进的查询并添加查询优化器可以使用的索引。

问题仍然存在:您如何检查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;
Run Code Online (Sandbox Code Playgroud)

如果您发现 Sort_merge_passes 和速率太高,则可以随意增加sort_buffer_size。假设你想提高到 4M。你会运行这个:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;
Run Code Online (Sandbox Code Playgroud)

然后您将其添加到 my.cnf

[mysqld]
sort_buffer_size = 4M
Run Code Online (Sandbox Code Playgroud)

您将定期运行代码以检查其他时间Sort_merge_passes峰值。

  • @RolanoMySQLDBA 您能否在以下内容中定义“许多”:“如果您每秒看到许多 Sort_merge_passes” (10认同)
  • 这是更好的答案 (2认同)

小智 4

您不需要更改默认的 sort_buffer_size。您根据问题误解了它的用途。您应该首先检查 SQL,看看是否能够调整它并使用索引满足 ORDER BY/GROUP BY 条件。它通常是一个综合指数。

此外: http: //www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/

  • 抱歉,我发现这篇文章几乎没有用。这就像告诉人们不要因为你不是专家而做某事。正如第一位评论者所指出的,mysql 附带的示例“.cnf”文件不使用默认设置。 (2认同)