錯誤訊息:
Out of sort memory, consider increasing server sort buffer size
Out of sort memory, consider increasing server sort buffer size
MySQL Out of sort memory(1038 error)代表排序過程中記憶體不足,常見於 ORDER BY、GROUP BY 或 JOIN 查詢。 大多數情況並不是單純記憶體不足,而是 SQL 設計或索引缺失造成。
一、發生原因(CentOS / MySQL 常見情境)
- ORDER BY 欄位沒有 Index
- 未使用 LIMIT 導致全表排序
- JOIN 產生大量中間資料
- GROUP BY 未優化
- sort_buffer_size 設定過小
👉 MySQL 排序流程:記憶體 → 不足 → 磁碟 → 最後錯誤
二、快速修復(CentOS 設定)
/etc/my.cnf.d/server.cnf
[mysqld] sort_buffer_size = 4M
⚠️ 設定修改後「不會立即生效」,必須重新啟動 MySQL 服務才會套用
🔧 重新啟動 MySQL(必要步驟)
systemctl restart mysqld
👉 注意:修改 my.cnf 或 server.cnf 後,一定要重新啟動 mysqld,否則新設定不會被載入。
🔍 確認設定是否生效
mysql -u root -p SHOW VARIABLES LIKE 'sort_buffer_size';
✔ 若數值未改變,代表尚未重啟或設定檔位置錯誤
三、根本解法(SQL 優化)
ALTER TABLE orders ADD INDEX idx_created_at (created_at);
SELECT id, created_at FROM orders ORDER BY created_at DESC LIMIT 50;
SELECT id, name FROM users;
EXPLAIN SELECT * FROM orders ORDER BY created_at;
👉 type = ALL / key = NULL = 沒有索引
延伸閱讀(MySQL 錯誤系列)
MySQL 錯誤排除系列(2026)四、FAQ 常見問題
MySQL Out of sort memory 是什麼錯誤?
代表 MySQL 在排序(ORDER BY 或 GROUP BY)時記憶體不足,通常因 SQL 沒有索引或 sort_buffer_size 不足造成。
只調 sort_buffer_size 能解決嗎?
不能完全解決,只能暫時改善,真正原因多半是 SQL 設計或索引問題。
為什麼 ORDER BY 會爆記憶體?
因為沒有索引時 MySQL 需要全表排序,導致 sort buffer 使用過高而爆掉。
sort_buffer_size 建議多少?
建議 2M~4M,中大型系統最多 8M,過大會影響整體 RAM 使用。
如何判斷 SQL 有問題?
使用 EXPLAIN,如果 type=ALL 或 key=NULL 表示沒有使用索引。
Index 一定能解決嗎?
大多數情況可以大幅改善排序效能,避免全表掃描。
CodeIgniter 會影響嗎?
不會,問題本質是 MySQL SQL 查詢設計。
會影響網站嗎?
會,查詢失敗會導致頁面錯誤或 API 無法回應。
這是 MySQL 錯誤排除系列文章之一,包含記憶體、連線、鎖定三大類問題。
