MySQL 擁有上百個可調參數,但掌握核心緩衝區/快取即可解決 80% 效能問題。本文延續調優系列,聚焦 table_cache、thread_cache、key_buffer、臨時表與查詢快取的監控指標與調整策略。
每張表對應一個檔案描述符,table_cache(5.1.3+ 稱 table_open_cache)控制同時開啟表的上限。
SHOW STATUS LIKE 'open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 5000 |
| Opened_tables | 195 |
+---------------+-------+
Opened_tables 快速增長 → table_cache 太小,建議調大(如 5000)。Open_tables 遠小於 table_cache → 設定過大,可適度縮減。頻繁建立/銷毀執行緒耗資源,thread_cache_size 保留閒置執行緒供下次連線複用。
SHOW STATUS LIKE 'threads%';
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| Threads_cached | 27 |
| Threads_connected | 15 |
| Threads_created | 838610 |
| Threads_running | 3 |
+-------------------+--------+
Threads_created 快速增長 → 增加 thread_cache_size(如 40)。Threads_created 增長緩慢,Threads_cached 維持合理池大小。key_buffer_size 存放 MyISAM 索引塊。目標:從記憶體讀取,避免磁碟 I/O。
SHOW STATUS LIKE '%key_read%';
+-------------------+-----------+
| Variable_name | Value |
+-------------------+-----------+
| Key_read_requests | 163554268 |
| Key_reads | 98247 |
+-------------------+-----------+
未命中率 = Key_reads / Key_read_requests。
經驗值: 每 1,000 請求 < 1 次磁碟讀取(< 0.1%)。若超過 → 增加 key_buffer_size(如 384M)。
複雜查詢(GROUP BY、ORDER BY、DISTINCT)可能產生臨時表。優先在記憶體(MEMORY 引擎),超過大小則轉 MyISAM 寫磁碟。
SHOW STATUS LIKE 'created_tmp%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 30660 |
| Created_tmp_files | 2 |
| Created_tmp_tables | 32912 |
+-------------------------+-------+
Created_tmp_disk_tables / Created_tmp_tables。tmp_table_size 與 max_heap_table_size 必須同時設定,取較小者生效。SHOW GLOBAL STATUS。innodb_buffer_pool_size,而非 key_buffer_size。緩衝區/快取調優核心在於「監控狀態變量 → 計算命中率/建立率 → 微調參數 → 持續觀察」。本文涵蓋的五大指標是入門必修課,下一篇將深入查詢快取、排序緩衝、檔案描述符與表鎖分析。