web-dev-qa-db-ja.com

mySQLでのtable_cacheのチューニング(および理解)

私は優れた MySQLパフォーマンスチューニングスクリプト を実行し、提案に取り組み始めました。私が遭遇したのは

テーブルキャッシュ
現在のtable_cache値= 4096テーブル合計1073テーブルがあります。 3900の開いているテーブルがあります。現在のtable_cacheヒット率は2%ですが、テーブルキャッシュの95%が使用されています。おそらくtable_cacheを増やす必要があります

私はtable_cacheを読み始めましたが、 MySQLのドキュメント がかなり不足していることがわかりました。彼らはtable_cache、「記憶があれば」。残念ながらtable_cache変数は、「すべてのスレッドで開いているテーブルの数」として定義されます。

この変数を増やすと、MySQLが使用するメモリはどのように変化しますか?それを設定するのに良い値は何ですか?

18
jotango

MySQLドキュメント から

たとえば、200の同時実行接続の場合、少なくとも200×Nのテーブルキャッシュサイズが必要です。ここで、Nは、実行するすべてのクエリの結合ごとのテーブルの最大数です。一時テーブルとファイル用に追加のファイル記述子を予約する必要もあります。

したがって、アプリケーションに4つのテーブルを結合するクエリがあり、200の同時接続を処理できるようにしたい場合、そのステートメントに基づいて、少なくとも800のtable_cacheが必要です。

メモリ使用量に関する限り、私にはそれらの数はありませんが、それがキャッシュしているテーブルのサイズに依存するのではないかと思います。

16
ManiacZX

Opened_Tables変数を監視して、それがどれだけ速く増加するかを確認する必要があります。新しいテーブル(一時テーブルを含む)を作成するよりもはるかに速い場合は、テーブルキャッシュが小さすぎる可能性があります。

Table_Cacheは常に-ほとんどの場合とにかく-サーバー内のテーブルの総数よりも大幅に大きくする必要があります。それ以外の場合は、テーブルを開閉し続けます。

サーバーの再起動直後の時間を測定したり、FLUSH TABLESを(クエリの数に関連して)たくさん使用したりしない限り、2%のキャッシュヒット率を得る方法がわかりません。通常、テーブルキャッシュのヒット率は99.9%である必要があります。そうしないと、パフォーマンスが低下します。

回避できる場合はFLUSH TABLESを実行しないでください。キャッシュが吹き飛ばされます。

FRMファイルを読み取る必要があるため、テーブルを開くには負荷がかかります。 MyISAMでは、テーブルを閉じるときに、インデックスから取得したキーキャッシュ内のすべてのブロックも破棄されるため、(他のエンジンよりも)かなり悪いです。したがって、テーブルを閉じると、キーキャッシュからインデックスがダンプされます==良くありません!他のエンジンはキャッシュされたブロックを保持しますが、メタデータを再読み取りしていくつかの構造を割り当てる必要があります。

3
MarkR