table_open_cache (MySQL 5.1.3 前稱 table_cache) 控制**服務端表緩存池**的大小。它直接影響「打開表」的頻率、文件描述符佔用、以及查詢響應延遲。本文深入剖析其工作機制、監控指標、調優策略及常見誤區。
SHOW GLOBAL STATUS LIKE 'Open_tables';
SHOW GLOBAL STATUS LIKE 'Opened_tables';
SHOW GLOBAL STATUS LIKE 'Table_open_cache%'; -- 5.6+ 顯示 hits/misses/overflows
建議值 ≈ max_connections × (單查詢最大涉及表數 N) + 臨時表余量
# 典型 Web 應用 N=2-10,max_connections=500 → 建議 2000-5000+
| 限制因素 | 說明 | 解決/建議 |
|---|---|---|
| open_files_limit (OS 文件描述符) | MySQL 啟動時會申請 max(table_open_cache × 2, max_connections × 5) 級別的文件句柄。受 ulimit -n 和 /etc/security/limits.conf 限制。 | 必須同步調大 OS 限制:echo "* soft nofile 65535" >> /etc/security/limits.confecho "* hard nofile 65535" >> /etc/security/limits.confMySQL 配置 open_files_limit = 65535 |
| 內存佔用 | 每個表對象佔用 ~几 KB 內存 (含結構體、權限檢查緩存)。10萬表 ≈ 幾百 MB。通常不是瓶頸。 | 現代服務器內存充足,一般不作瓶頸考慮。 |
| FLUSH TABLES 影響 | 執行 FLUSH TABLES 或 FLUSH TABLES WITH READ LOCK 會清空/鎖定緩存,導致後續查詢重新打開表,Opened_tables 飆升。 | 避免頻繁手動 FLUSH;備份用 XtraBackup 替代。 |
Open_tables 峰值、Opened_tables 增長速率、Overflows 次數。table_open_cache = max(峰值 Open_tables × 1.5, max_connections × 4)。典型值 2000-10000。limits.conf、systemd LimitNOFILE、MySQL open_files_limit。**必須重啟 MySQL 生效**。Opened_tables 增長趨緩、Overflows=0、命中率 > 95%。table_open_cache_instances (默認 1,建議設為 CPU 核心數/8,如 8 或 16),將緩存分片為多個實例,**減少全局互斥鎖爭用**,高併發顯著提升吞吐。table_open_cache 需更大,open_files_limit 更需充足。table_open_cache 是**「調大無副作用、調小傷性能」**的典型參數。核心策略:**配足 OS 文件句柄限制,設置為滿足峰值並發熱表數量的 1.5-2 倍,啟用多實例分片 (5.6+)**, 通過 Opened_tables 增長率和 Overflows 持續監控。不要吝嗇文件描述符,它是高併發 MySQL 的生命線。