MySQL Out of sort memory 錯誤解決(2026)|1038 Error 排序記憶體不足原因 + sort_buffer_size + SQL 優化

MySQL Out of sort memory 錯誤解決(2026)|1038 Error 排序記憶體不足 + sort_buffer_size + SQL 優化
錯誤訊息:
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 錯誤排除系列文章之一,包含記憶體、連線、鎖定三大類問題。

    PAGE TOP