MySQL 優化之 table_open_cache


背景:

MySQL實例利用率一直居高不下

問題排查:

1. 查看連接數,沒發現有長時間未釋放的長鏈接

mysql> show full processlist;

2、查看表高速緩存設置

mysql> show variables like '%table_open_cache%';

3、查看實際緩存狀態

mysql> show global status like 'open%tables%';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Open_tables   | 785    |
| Opened_tables | 508331 |
+---------------+--------+

 table_open_cache 與 Open_tables 值相等,但是Opend_tables值很大。說明MySQL正在釋放緩存的表以容納新的表,這個過程消耗資源。所以需要加大 table_open_cache的值,我們的MySQL實例是4G內存,這里我們改成2048。

4、變更設置

臨時修改:
mysql> set global table_open_cache = 2048;
配置文件修改:
[mysqld]
table_open_cache = 2048

5、table_open_cache合理值的建議

Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95

實際操作過程中,可以把table_open_cache值設置得比Open_tables大一些,然后慢慢增加,逐步調試。


調大 table_open_cache 參數值,減少業務表頻繁打開和關閉。至於調整到多少合適,查看 MySQL 狀態參數 Open_tables 和 Opened_tables,當 Open_tables 接近 table_open_cache,並且 Opened_tables 不會快速增加時,那么此時的 table_open_cache 值就是一個比較合適的值。

table_open_cache 也不是越大越好,畢竟在表多的時候,也需要更多的內存消耗。

除了 table_open_cache 之外,還有兩個參數,可以一起關注一下:

  • table_open_cache_instances
  • table_definition_cache

如果 table_open_cache_instances 設置過小,在高並發場景下,可能導致 MySQL 內部線程嚴重的mutex 競爭


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM