key_buffer_size 控制 **MyISAM** 索引塊緩衝區大小,直接決定索引讀取速度。**僅對 MyISAM 生效** (內部臨時表亦為 MyISAM 受影響)。
mysql> SHOW STATUS LIKE 'key_read%';
+-------------------+------------+
| Variable_name | Value |
+-------------------+------------+
| Key_read_requests | 3916880184 |
| Key_reads | 1014261 |
+-------------------+------------+
miss_rate = Key_reads / Key_read_requests
-- 範例: 1014261 / 3916880184 ≈ 1:4000 (0.025%)
mysql> SHOW STATUS LIKE 'key_blocks_u%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Key_blocks_unused | 0 |
| Key_blocks_used | 50000 |
+-------------------+-------+
Key_blocks_unused = 0 → 緩衝區滿載,必須調大used / (used + unused) ≈ 80%| 現象 | 對應調整 |
|---|---|
Opened_tables 持續增長 | 調大 table_cache |
Key_reads 過大 / 未命中率高 | 調大 key_buffer_size |
Handler_read_rnd 過大 | SQL 缺乏索引,優化查詢而非參數 |
Threads_created 過大 | 調大 thread_cache_size |
Created_tmp_disk_tables 過大 | 調大 tmp_table_size / max_heap_table_size |
key_buffer_size = 512MKey_read_requests: 2,454,354,135,490
Key_reads: 23,490
miss_rate ≈ 0.001% (極低)
Key_blocks_unused: 0 (緩衝區已滿)
雖未命中率極低,但 Key_blocks_unused = 0 表示緩衝區 100% 滿載,新索引無法緩存,長期會導致抖動。決策調大至 2048M (2GB),佔物理記憶體 25%。
Key_blocks_unused 穩定在 15% 左右SET GLOBAL key_buffer_size = 2048M; 即時生效,但重啟失效,需同步寫入 my.cnfhot_cache) + LOAD INDEX INTO CACHE 預載,解決啟動預熱慢問題科學讀取 Key_reads、Key_blocks_unused 等指標,結合業務負載特徵,才能給 key_buffer_size 定出最合適的「黃金數值」。