直接改my.ini的sort_buffer_size即可,需在[mysqld]段下设置(如sort_buffer_size=2M),修改后必须重启MySQL服务才生效,且该值为会话独占内存,过高易引发OOM。

直接改 my.ini 里的 sort_buffer_size 就行,但别设太高
XAMPP 自带的 MySQL 在 Windows 下用的是 my.ini(不是 my.cnf),路径通常是 XAMPP\mysql\bin\my.ini。打开它,找到 [mysqld] 段落,在下面加一行:sort_buffer_size = 2M。
这个值不是越大越好——它是每个排序操作**独占分配**的内存,设成 8M 时,10 个并发排序就吃掉 80MB;低配机(比如 1GB 内存)设超过 4M 就容易触发 swap 或 OOM。
为什么改了不生效?检查连接是否用了新配置
sort_buffer_size 是会话级参数,修改配置文件后必须重启 MySQL 服务(用 XAMPP 控制面板点 stop/start,或命令行 net stop mysql && net start mysql)。否则老连接仍沿用旧值。
验证是否生效,连进 MySQL 执行:SHOW VARIABLES LIKE 'sort_buffer_size';
注意:如果看到返回值还是 256K 或 1M,说明没重启成功,或者你改错了段落(确认是在 [mysqld] 下,不是 [client] 或其他)。
线上临时调优可以用 SET SESSION,但别依赖它长期运行
不想重启服务时,可对当前连接动态调整:SET SESSION sort_buffer_size = 4194304;(即 4M)
但它只影响当前会话,断开重连就失效。更重要的是:它无法降低已发生的磁盘归并次数——Sort_merge_passes 状态变量只在新排序操作中反映效果。
查归并压力:SHOW GLOBAL STATUS LIKE 'Sort%';
重点关注 Sort_merge_passes:如果它占总排序次数(Sort_scan + Sort_range)超 10%,说明缓冲区确实不够用。
和 tmp_table_size 别搞混:排序和临时表是两套机制
sort_buffer_size 只管 ORDER BY 的内存排序过程,对 GROUP BY、DISTINCT、UNION 这类需要建临时表的操作完全无效。
后者靠的是 tmp_table_size 和 max_heap_table_size,而且这两个值**必须相等**,MySQL 才按你设的上限执行;否则取小的那个。
常见错误:只改了 tmp_table_size = 64M 却漏掉 max_heap_table_size,结果临时表一超 16M(默认值)就落盘,Using temporary 标记照常出现。


















