table_definition_cache
を発見しました。何に設定するかを決定しようとしています。パフォーマンスの問題のため、設定をいじっています。
1台のサーバーに36599テーブルがあり、SHOW GLOBAL STATUS
を実行すると、Openedテーブルの値は930312です。table_definition_cache
は20kに設定されています。
別のサーバーでは45349個のテーブルがあり、SHOW GLOBAL STATUS
を実行すると、Openedテーブルの値は94383になります。table_definition_cache
は40kに設定されます。
サーバーが多くのオープン/スワッピングを実行しているように見えるため、table_definition_cache
の値を何に設定するかわかりません。
どちらのサーバーもCentOS 6で稼働している
サーバーのバージョン:5.6.32-78.0 Percona Server(GPL)、リリース78.0、リビジョン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%以上にする必要があります。したがって、Opened_tablesの値を高くする理由はたくさんありますが、この値を下回っている場合は、table_open_cacheの値を増やす必要があります。 FLUSH TABLESと同様に、開いているすべてのテーブルを閉じて再度開き、Opened_tablesの値を大幅に増やします。
Table_open_cache = total_tables*Threads_connected
すべてのスレッド(ユーザー)が通常すべてのテーブルにアクセスするわけではないため。計算された値の50%を設定すべきだと思います。この変数の値が大きすぎると、他の副作用が発生するためです。だから式は
Table_open_cache = total_tables*Threads_connected*.50
table_open_cache
とともに、open_files_limit
システム変数も調整する必要があります。一般的にはtable_open_cache
の2倍です。
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ドキュメントバージョンでは式についての言及はありません)。したがって、最初に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
Opened_tablesはUptimeなしでは役に立ちません。それらの商は何ですか? 1秒あたり2未満に保つことをお勧めします。