首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL table_cache (table_open_cache) 參數深度解析:緩存機制、調優邏輯與清理命令

     編輯:MySQL 資料庫相關知識

參數演進

  • MySQL ≤ 5.1.2:table_cache
  • MySQL ≥ 5.1.3:table_open_cache (別名兼容舊名)

控制表緩存最大條目數,每個客戶端連接至少訪問一個表,故與 max_connections 強相關。

緩存機制詳解

  1. 查找:線程訪問表時,先檢查緩存中是否已打開該表
  2. 命中:直接使用緩存中的表句柄,避免文件打開/權限檢查開銷
  3. 未命中:打開表文件 (.frm, .MYD, .MYI 或 .ibd),加入緩存
  4. 淘汰:緩存滿時,按 LRU (最近最少使用) 淘汰舊條目

存儲引擎差異

引擎數據文件描述符索引文件描述符備註
MyISAM每線程獨享全線程共享首次打開佔 2 FD,後續僅 1 FD
InnoDB (共享表空間)單一 ibdata1共享FD 佔用極低
InnoDB (獨立表空間)每表 .ibd共享FD 佔用隨表數線性增長

關鍵狀態變量

mysql> SHOW GLOBAL STATUS LIKE 'open%_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 450   |
| Opened_tables | 1200  |
+---------------+-------+
  • Open_tables:當前緩存表數
  • Opened_tables:歷史緩存未命中次數 (每次未命中 +1)

調優決策樹

  1. Opened_tables 持續快速增長 (如 > 100/秒) → table_open_cache 過小,調大
  2. Open_tables ≈ table_open_cache 且 Opened_tables 增長 → 緩存滿,調大
  3. Open_tables / Opened_tables ≥ 85% 且 Open_tables / table_open_cache ≤ 95% → 配置適中
  4. Open_tables 遠小於 table_open_cache 且 Opened_tables 穩定 → 可調小釋放內存

保守配置建議

生產環境試運行一段時間 (含峰值期),將 table_open_cache 設為 Opened_tables 峰值 × 1.2,確保極端負載下仍有餘量。

清理緩存命令

FLUSH TABLES;
-- 或
FLUSH TABLES WITH READ LOCK;  -- 備份前確保一致性

會關閉所有打開的表,釋放文件描述符,緩存歸零。慎用於高併發業務高峰期。

文件描述符系統限制聯動

# 檢查系統級限制
ulimit -n
# MySQL 啟動用戶需足夠 FD 配額,建議 /etc/security/limits.conf:
mysql soft nofile 65535
mysql hard nofile 65535

table_open_cache 過大可能觸及系統 open_files_limit 限制,導致 Can't open file 錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved