key_buffer_size = 可用內存的 20%innodb_buffer_pool_size = 0innodb_buffer_pool_size = 可用內存的 70%key_buffer_size = 10M(極小但非零)my.cnf/my.ini[mysqld] 區塊下的配置MyISAM 緩存分兩部分:
⚠️ 必須預留足夠內存給操作系統。某些 OS 顯示內存使用率超 90% 實際仍有大量可用內存。
驗證 Key Buffer 是否足夠:
SHOW GLOBAL STATUS LIKE 'Key%';
-- 計算 Key_read_requests / Key_reads,比值 > 10 表示足夠
InnoDB 所有緩存均在 Buffer Pool,大小由 innodb_buffer_pool_size 控制。包含:
MySQL 5.5+ 支援:
innodb_buffer_pool_instances),每個實例獨立 mutex,緩解多核爭用SHOW TABLE STATUS 獲取表狀態Index_length 總和 → 設 key_buffer_size ≤ 此值Data_length + Index_length 總和 → 設 innodb_buffer_pool_size = 總和的 110%SQL 快速統計各引擎佔用:
SELECT ENGINE,
ROUND(SUM(data_length)/1024/1024,1) AS "Data MB",
ROUND(SUM(index_length)/1024/1024,1) AS "Index MB",
ROUND(SUM(data_length+index_length)/1024/1024,1) AS "Total MB",
COUNT(*) AS "Num Tables"
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema NOT IN ('information_schema','performance_schema')
GROUP BY ENGINE;
MySQL 設計於單核時代,關鍵路徑存在少量 mutex:
key_bufferbuffer_pool多核普及導致 mutex 爭用成為性能瓶頸:CPU 核心超 4-8 核時 MySQL 變慢而非變快。改進情況:
| 場景 | 限制 | 建議配置 |
|---|---|---|
| 32位 OS + 32位 MySQL | 進程限制 4GB,實際可用更少(如 FreeBSD maxdsiz 默認 512MB) | 確認 ulimit -m,設置緩存為可用內存 20%-70% |
| 64位 OS + 32位 MySQL | MySQL 仍受 4GB 限制 | key_buffer_size ≤ 3GB,buffer_pool ≤ 3GB,強烈建議升級 64位 MySQL |
| 64位 OS + 64位 MySQL | 無實際限制 | 見下文詳細建議 |
key_buffer_size = 20% RAM(5.1.23 前限制 4GB),innodb_buffer_pool_size = 0innodb_buffer_pool_size = 70% RAM,大內存考慮多實例(1-16 個,各 ≥1GB),key_buffer_size = 20Mmax_connections 過大引發其他問題thread_stack=256Ktable_open_cache)Opened_files / Uptime > 5 增大,≈1 可減小query_cache_type = OFF
query_cache_size = 0
理由:單一全局 mutex 導致高並發嚴重爭用;任何寫入導致相關表所有緩存失效(線性清理算法,大 QC 極慢);微小 SQL 差異產生重複緩存項。
若必須使用:query_cache_size ≤ 50M、query_cache_type = DEMAND、顯式指定 SQL_CACHE/SQL_NO_CACHE。
thread_cache_size = 10 即可,極小內存開銷,加速連接創建。
啟用 log_bin 時建議 expire_logs_days = 14 防止磁盤填滿。
MySQL 需穩定內存分配,任何 swap 嚴重損害性能。
swappiness = 5(折中值)問題:OS 預設將內存分配到第一個 CPU 節點,耗盡後導致 MySQL 內存被 swap 出去。
解決:BIOS 設置內存分配為 Interleave(交錯),犧牲 ~50% 遠端訪問延遲,換取穩定性能。收益:單位百分點級。
TLB 未命中導致雙重查找開銷。配置 4MB Huge Pages 給 innodb_buffer_pool:
large-pages收益:單位百分點級。
max_heap_table_size 默認 16MB,勿調過大竊佔 RAM。
[mysqld] 區塊添加 參數=值(支援 M/G 後綴),重啟生效SET @@global.參數=值(不支援單位後綴),即時生效Apache MaxClients ≤ 50,避免超過 MySQL max_connections。
⚠️ 工具報告「Maximum possible memory usage > 100%」屬保守估算(假設所有連接並發執行內存密集操作),無需恐慌。
碎片表優化:OPTIMIZE TABLE 針對高「free space」或大量 DELETE/UPDATE 的表,月執行一次足矣。