錯誤訊息 Sort aborted: Out of sort memory, consider increasing server sort buffer size 直指排序緩衝區不足。盲目調大參數可能導致記憶體耗盡與效能倒退。本文從原理、實測數據、生產建議三維度深度解析。
ORDER BY、GROUP BY、DISTINCT、UNION 等需排序操作filesort 演算法(無索引可用)sort_buffer_size,強制落盤合併排序tmpdir 空間不足或排序緩衝區極小,拋出此錯誤| 特性 | 說明 | 影響 |
|---|---|---|
| Connection-level | 每個連線獨立分配 | 500 連線 × 8MB = 4GB 記憶體壓力 |
| Lazy allocation | 首次排序時一次性分配全量 | 非排序查詢不佔用 |
| 分配機制閾值 | <= 256KB 用 malloc() > 256KB 用 mmap() | mmap 系統呼叫開銷大,效能下降 ~30% |
| 非越大越好 | 過大導致記憶體碎片、Swap、OOM Killer | 高併發環境建議 256KB~2MB |
測試環境:1GB RAM Fedora VM、1萬列測試表、ORDER BY pad LIMIT 1 強制 filesort、100 併發、10 迭代
| sort_buffer_size | 平均耗時 | 最小耗時 | 最大耗時 | 分配機制 |
|---|---|---|---|---|
| 250 KB | 1.318 秒 | 1.285 秒 | 1.378 秒 | malloc() |
| 512 KB | 1.944 秒 | 1.362 秒 | 4.406 秒 | mmap() |
| 3 MB | 2.412 秒 | 2.376 秒 | 2.527 秒 | mmap() |
結論:跨越 256KB 閾值觸發 mmap() 後,效能下降 30%~80%。小緩衝區配合 LIMIT 反而更快,因減少記憶體分配開銷。
| 場景 | 建議值 | 理由 |
|---|---|---|
| OLTP 高併發 (核心業務) | 256 KB ~ 512 KB | 避免 mmap、控制連線記憶體佔用 |
| OLAP/報表/批次低併發 | 2 MB ~ 8 MB | 大排序受益於較大緩衝,連線數可控 |
| 混合負載 | 1 MB (動態調整) | Session 級 SET sort_buffer_size=4M 針對大查詢臨時調大 |
| 16GB+ 專用資料庫伺服器 | 2 MB | 官方文檔 16G 範例配置 |
# 臨時表記憶體上限(配合 sort_buffer_size) tmp_table_size = 64M max_heap_table_size = 64M # 讀取緩衝(順序掃描) read_buffer_size = 2M read_rnd_buffer_size = 8M # JOIN 緩衝(無索引關聯) join_buffer_size = 2M
EXPLAIN 是否出現 Using filesorttmpdir 磁碟空間:df -h /tmpSort_merge_passes 狀態變數:SHOW GLOBAL STATUS LIKE 'Sort_merge_passes'; 數值大表示頻繁落盤合併LIMIT 減少排序集合SET SESSION sort_buffer_size=4M; 僅影響當前連線