MySQL 伺服器效能調優猶如精雕細琢的藝術,其中 table_cache(表緩存)與 key_buffer_size(索引緩衝區)是影響資料庫響應速度的兩大核心參數。本文結合實戰經驗,深入剖析這兩個參數的運作機制、監控指標與調優策略,助您找到最適配的配置平衡點。
table_cache 定義了 MySQL 可同時打開的表緩存數量。當執行緒存取資料表時,若緩存中已存在該表,則直接讀取;若緩存有空間,則打開表並放入緩存;若緩存已滿,MySQL 會依規則釋放閒置表或臨時擴展緩存。良好的表緩存機制能顯著降低檔案開啟/關閉的系統開銷,提升 SQL 響應速度。
判斷是否需擴大 table_cache 的核心依據為峰值時段的狀態值:
調優信號:若 Open_tables 接近 table_cache 設定值,且 Opened_tables 持續快速增長,表明緩存不足,頻繁觸發磁碟 I/O,需適度增大該參數。
預設值隨實體記憶體增長(2GB 以下 256~512,4GB 為 2048),但盲目調大易引發副作用:
open_files_limit 需至少設為 4096(4GB 記憶體建議 8192)。系統層面修正:勿僅用 ulimit -n 臨時調整(換終端即失效),應修改 /etc/sysctl.conf 並同步設定 open_files_limit 參數。
key_buffer_size 專供 MyISAM 儲存引擎使用,決定索引區塊的記憶體緩衝大小,直接影響索引讀取速度。即便主力引擎為 InnoDB,內部臨時表仍為 MyISAM,故此參數不可忽視。
透過 SHOW GLOBAL STATUS LIKE 'Key_read%' 獲取:
關鍵比率:Key_reads / Key_read_requests
實測案例:某 64GB 記憶體伺服器,將 key_buffer_size 從 512MB 調至 2048MB,未命中率從 0.024% 進一步降低,效能明顯提升且無記憶體溢位。
檢視 Key_blocks_used 與 Key_blocks_unused:
使用率 = Key_blocks_used / (Key_blocks_used + Key_blocks_unused) * 100% ≈ 80% 為理想區間。若接近 100%,需擴容或檢視是否存在過度索引。
key_buffer,可將熱點表索引綁定專屬緩存(CACHE INDEX ... IN key_buffer_name + LOAD INDEX INTO CACHE)。效能優化無標準答案,唯有「觀測 → 分析 → 調整 → 驗證」的閉環。table_cache 重在匹配並發連接與表關聯複雜度,key_buffer_size 核心在於索引命中率與記憶體分配比例。切記:參數服務於業務負載,而非追求極值。建議建立基準線監控,定期複盤,讓 MySQL 在穩健中釋放極致效能。