我應該將我的 table_definition_cache 設置為什麼?
我剛剛發現
table_definition_cache
,我正在嘗試決定將其設置為什麼。由於性能問題,我正在弄亂我的配置。在一台伺服器上,我有 36599 個表,當我執行
SHOW GLOBAL STATUS
Opened tables 的值是 930312。table_definition_cache
設置為 20k。在另一台伺服器上,我有 45349 個表,當我執行
SHOW GLOBAL STATUS
Opened tables 的值是 94383。table_definition_cache
設置為 40k。我不確定將其設置為什麼
table_definition_cache
值,因為伺服器似乎做了很多打開/交換。兩台伺服器都是 CentOS 6 並且正在執行
伺服器版本:5.6.32-78.0 Percona Server (GPL),Release 78.0,Revision 8a8e016
感謝您的關注!我非常感謝您的回饋。
我希望這個連結可以幫助你決定你的微調。稍後我的回答,對不起。
我可以使用此資訊解決 5.5 MySQL 版本中的一些問題。
在這裡:您可以檢查如何計算您的
table_open_cache
open_tables
查找和的目前值opened_tables
mysql> show global status like 'open%';
所有執行緒的打開表數。增加這個值會增加 mysqld 需要的文件描述符的數量。您可以通過檢查 Opened_tables 狀態變數來檢查是否需要增加表記憶體。如果 Opened_tables 的值很大並且您不經常使用 FLUSH TABLES(這只是強制所有表關閉並重新打開),那麼您應該增加 table_open_cache 變數的值。
- 找出表記憶體命中率
Table cache hit rate = table_open_cache*100/Opened_tables
一般應大於 50%。所以你需要增加 table_open_cache 的值,如果你低於這個值,雖然有很多理由讓 Opened_tables 的值很高。像 FLUSH TABLES 將關閉所有打開的表並重新打開它,這會顯著增加 Opened_tables 的值。
- 計算table_open_cache的tune值並設置
Table_open_cache = total_tables*Threads_connected
由於所有執行緒(使用者)通常不會訪問所有表。我認為你應該設置計算值的 50%。因為這個變數的值太大會有一些其他的副作用。所以公式變成了
Table_open_cache = total_tables*Threads_connected*.50
- 與
table_open_cache
您一起還應該調整open_files_limit
系統變數。一般是 2 倍
table_open_cache
。
open_files_limit= Table_open_cache*2
open_files_limit
不是動態變數。所以你應該在 my.cnf 文件中設置它並重新啟動 MySQL。確保您的作業系統可以處理設置所需的打開文件描述符的數量
table_open_cache
。參考。https://techinfobest.com/optimize-mysql-table_open_cache/
在這裡:MySQL 文件為我們提供了
table_definition_cache
基於table_open_cache
大小設置的公式。(是的,我知道,連結是 5.7 版本的,但在 5.5 doc 版本中沒有提到公式),所以你需要先定義 的大小table_open_cache
,這就是我在上面給對外連結接的原因。https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_table_definition_cache
接下來,您必須監視伺服器的狀態
COM_STMT_REPREPARE
並Open_table_definitions
查看伺服器中發生的情況。如果您有正在使用prepared statements
並獲取消息的應用程序,則error code [1615]Prepared statement needs to be re-prepared
表明 MySQL 正在刷新記憶體的定義表.. ( https://dev.mysql.com/doc/refman/5.5/en/error-messages-server. html#error_er_need_reprepare )最後:關於mysql為什麼要重新準備stmt的資訊
https://dev.mysql.com/doc/refman/5.5/en/statement-repreparation.html