Mysql

我應該將我的 table_definition_cache 設置為什麼?

  • October 4, 2018

我剛剛發現table_definition_cache,我正在嘗試決定將其設置為什麼。由於性能問題,我正在弄亂我的配置。

在一台伺服器上,我有 36599 個表,當我執行SHOW GLOBAL STATUSOpened tables 的值是 930312。table_definition_cache設置為 20k。

在另一台伺服器上,我有 45349 個表,當我執行SHOW GLOBAL STATUSOpened 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

  1. open_tables查找和的目前值opened_tables

mysql> show global status like 'open%';

所有執行緒的打開表數。增加這個值會增加 mysqld 需要的文件描述符的數量。您可以通過檢查 Opened_tables 狀態變數來檢查是否需要增加表記憶體。如果 Opened_tables 的值很大並且您不經常使用 FLUSH TABLES(這只是強制所有表關閉並重新打開),那麼您應該增加 table_open_cache 變數的值。

  1. 找出表記憶體命中率

Table cache hit rate = table_open_cache*100/Opened_tables

一般應大於 50%。所以你需要增加 table_open_cache 的值,如果你低於這個值,雖然有很多理由讓 Opened_tables 的值很高。像 FLUSH TABLES 將關閉所有打開的表並重新打開它,這會顯著增加 Opened_tables 的值。

  1. 計算table_open_cache的tune值並設置

Table_open_cache = total_tables*Threads_connected

由於所有執行緒(使用者)通常不會訪問所有表。我認為你應該設置計算值的 50%。因為這個變數的值太大會有一些其他的副作用。所以公式變成了

Table_open_cache = total_tables*Threads_connected*.50

  1. 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_REPREPAREOpen_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

引用自:https://dba.stackexchange.com/questions/183566