SELECT aid, GROUP_CONCAT(bid) FROM tbl GROUP BY aid LIMIT 1; -- Query OK, 1 row affected, 1 warning (3 min 45.12 sec) SHOW WARNINGS; -- | Warning | 1260 | 1 line(s) were cut by GROUP_CONCAT() |
結果被靜默截斷,**無報錯、無異常、只有 Warning**,極易導致數據不完整進入下游系統。
SELECT @@global.group_concat_max_len; -- 1024
MySQL 將 GROUP_CONCAT 結果限制在 1KB,超過即截斷。對於 ID 列表、標籤聚合等場景,**極易超限**。
SET SESSION group_concat_max_len = 1024000; -- 1MB SET SESSION group_concat_max_len = 10485760; -- 10MB (最大值 2^31-1)
[mysqld] group_concat_max_len = 1024000
SET GLOBAL group_concat_max_len = 1024000;
-- 1. 調大參數
SET SESSION group_concat_max_len = 1024000;
-- 2. 完整語法:排序 + 自定義分隔符
SELECT
aid,
GROUP_CONCAT(bid ORDER BY bid SEPARATOR ',') AS bid_str
FROM tbl
GROUP BY aid;
-- 3. 驗證無 Warning
SHOW WARNINGS; -- Empty set
SELECT
category,
GROUP_CONCAT(
DISTINCT product_name
ORDER BY price DESC
SEPARATOR ' | '
) AS top_products
FROM products
WHERE status = 1
GROUP BY category;
| 參數值 | 單行最大 | 內存風險 | 適用場景 |
|---|---|---|---|
| 1024 (默認) | 1KB | 無 | 極小聚合 |
| 65535 | 64KB | 低 | 常規報表 |
| 1048576 (1MB) | 1MB | 中 | 大列表聚合 |
| 10485760 (10MB) | 10MB | 高 (大量併發時) | 極大聚合/一次性導出 |
內存計算:每個線程分配 group_concat_max_len 大小的緩衝區。100 併發 × 10MB = 1GB 內存壓力。
group_concat_max_len = 1048576 (1MB),覆蓋 95% 場景SET SESSION ... = 10M,導出後復原Code 1260,自動告警排查group_concat_max_len 是 MySQL 最容易被忽視的**「隱形炸彈」**。一行配置、一個監控、一套分級策略,徹底拆除截斷風險。