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


18

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

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

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

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

回答:


16

MySQLドキュメントから

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

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

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


ポインターをありがとう。RAMの使用量がどのように変化するかを知らずに、table_cacheの数を増やすのが少し怖いです。マシンのRAMはすでにいっぱいです。
jotango

メモリが実際に使い果たされているのか、それともメモリがバッファ/キャッシュによって占有されているのか確認してください。"free -m"を実行し、2行目(-/ + buffers / cache)を見てください。これは、mb単位のメモリ使用量のより正確な表現です。で回答を参照してください serverfault.com/questions/73189/...serverfault.com/questions/9442/...
ManiacZX

はい、それは本当にメモリを使用しています。昨日は交換されましたが、これは本番データベースにとっては本当に悪いことです。今日、HPにRAMのアップグレードを注文しました。
jotango

今これに来ている人にとって、この答えはmysql 5.1以降では正確ではありません。今table_open_cacheでは、ドキュメントを見るときに参照します。見ているときに@MarkRsの回答を参照してくださいtable_cache
ジェイソン

3

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

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

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

FLUSH TABLESを避けてください。キャッシュを吹き飛ばしてしまいます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.