人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLのquery cacheがうまく利用されていない気がします。
(MySQL 5.0.67-modified-logを利用しています)

疑問点は、query cacheに32MB割り当てましたが、ステータスを見てみるとQcache_free_memoryが17MBあるのに対して、Qcache_free_blocksが1しかありません。
私の認識では、以下の式が成り立つと考えていました。

Qcache_free_memory = Qcache_free_blocks * key cache block size

しかしながら実際の数値を代入すると以下となってしまい、認識が間違っていたようです。どこの認識が間違っているか教えていただきたいです。
17865784 = 1 * 1024


mysql> show status like 'QCa%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 17865784 |
| Qcache_hits | 27314861 |
| Qcache_inserts | 17590833 |
| Qcache_lowmem_prunes | 14252112 |
| Qcache_not_cached | 5444078 |
| Qcache_queries_in_cache | 3484 |
| Qcache_total_blocks | 7232 |
+-------------------------+----------+
8 rows in set (0.00 sec)

●質問者: まつぼっくり
●カテゴリ:コンピュータ インターネット
✍キーワード:00 cache Key MySQL SEC
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● goog20090901
●1ポイント

ブロックサイズは可変です。

この例だと1つのフリーブロックが17Mあるということです。

断片化とかしてたら、フリーブロックサイズが3とか4とかになるはずです。

◎質問者からの返答

質問中にある単語を使って解説お願いします。どの変数を指しているのかクリアにしたいので。

ご回答から察するに、以下の説明で正しいでしょうか?

------------------------------------------------------------------------------------------------------------------------------

free memoryから、キャッシュを保存するときにblockが割り当てられる。もし、free blockがあれば、それを優先的に使う。

言葉の定義は以下。

Qcache_free_memory=未だblockが割り当てられていないmemory

Qcache_free_blocks=blockが割り当てられているけど空のblock


2 ● kn1967
●69ポイント ベストアンサー

キャッシュを有効に使ってくれるかどうかは、

どのような構造のデータベースにどのようなSQLを投げているかに大きく左右されます。


まずは

Qcache_free_blocks = 1個

Qcache_free_memory = 17MB

断片化を起こすほど酷い状態ではなく、一見すると余裕があると見えなくもないが、

これらをもってして有効利用していないとまでは、まだ断言できない。


続いて、

Qcache_hits = 2731万回

Qcache_inserts = 1759万回

Qcache_not_cached = 544万回

利用数 = 2731 + 1759 + 544 = 5034

キャッシュの利用率 = 2731 / 5034 = 54%

2回に1回しかキャッシュから読み込んでいないという事になり、

あまり有効利用はされてないように見受けられるが、この原因がSQLにあるのか、

データ構造にまで及ぶのかは実データやSQLを見てみないことには、まだ判らない。


さらに、

Qcache_queries_in_cache = 3484個

Qcache_total_blocks = 7232個

Qcache_lowmem_prunes = 1425万回

空きメモリが17MBあったということから、メモリ量が十分とも誤解しやすいが、

それにしては、キャッシュに残っているクエリの数は決して多くない。

32-17=15MB使っていて3484個なので1個あたり4KBという小さなものなのに、

頻繁に消されるのは何故かを考えていかないといけないだろう。


対応としては、メモリ不足でキャッシュが頻繁に消されているという点から、

キャッシュ容量を増やすというのも一つの手。ただし、そもそもの原因が、

例えば、「時折、1回のSQLで得る結果が大きなものがある」だと仮定すると、

根元であるSQLのほうを何とかしないと、全体のパフォーマンスは上がらない。


結論的には、冒頭の繰り返しになるのだけど、

まずは「どのような構造のデータベースにどのようなSQLを投げているか」について、

見直さないといけないという話に戻ります。


なお、どのようなSQLを投げれば効率良くキャッシュされるかについては、

詳細な設計情報やソースそのものがないと絞り込めず、

あれやこれやの弁論大会になりそうなので、ひとまず置かせてください。

◎質問者からの返答

とても丁寧な回答ありがとうございます!

おっしゃること理解できました。

1点、Qcache_free_blocksの意味は以下の定義であっているのでしょうか?

> Qcache_free_memory=未だblockが割り当てられていないmemory

理由は、FLUSH QUERY CACHE するとQcache_free_memoryが1になり、Qcache_free_memoryが増加するので。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ