MariaDB执行含group_concat()的查询时内存不足,需调整哪个变量?
解决MariaDB执行GROUP_CONCAT关联查询时的内存不足问题
问题场景
在安装了MariaDB的CentOS 7服务器上执行以下SQL语句时:
SELECT h.id, h.name, group_concat(distinct d.name ORDER BY d.name SEPARATOR " ") AS descriptions FROM inventar h LEFT JOIN descriptions d ON(FIND_IN_SET(d.id, h.description_id) > 0) GROUP BY h.id,h.description_id ORDER BY h.name asc;
触发内存不足错误:
ERROR 5 (HY000): Out of memory (Needed 65535816 bytes)
已检查临时表相关变量,结果如下:
| Variable_name | Value |
|---|---|
| max_heap_table_size | 1048576000 |
| tmp_disk_table_size | 18446744073709551615 |
| tmp_memory_table_size | 12572426240 |
| tmp_table_size | 12572426240 |
所有临时表相关变量值均远大于错误提示中需要的65535816字节,排除临时表容量限制问题。
问题根源
错误核心原因是group_concat_max_len变量默认值过小。MariaDB中group_concat_max_len默认限制GROUP_CONCAT函数可拼接的最大字符串长度(默认值通常为65535字节,即64KB),而本次查询需要拼接的内容总长度超过该限制,从而触发内存不足报错。
解决方法
1. 临时调整(仅当前会话生效)
执行以下SQL临时修改当前会话的限制:
SET SESSION group_concat_max_len = 104857600; -- 设置为100MB,可根据实际需求调整
2. 全局永久调整(服务器重启后仍生效)
先执行全局设置:
SET GLOBAL group_concat_max_len = 104857600;
然后编辑MariaDB配置文件(通常为/etc/my.cnf或/etc/mysql/my.cnf),在[mysqld]段添加如下配置:
[mysqld] group_concat_max_len = 104857600
保存后重启MariaDB服务,配置即可永久生效。
内容的提问来源于stack exchange,提问作者user1980099
相关产品推荐
相关产品推荐

