【この記事の所要時間 : 約 4 分】
MySQLのチューニングにおいてクエリキャッシュは、データベースへアクセスする負荷を軽減するので、負荷が上がったときにチェックしたい項目の1つである。
MySQLのデフォルトでは、クエリキャッシュを使用しない状態になっているので注意したい。
query_cache_sizeの違いによるパフォーマンス比較
MySQLサーバには、MySQLクライアントからのクエリとその実行結果をキャッシュし、次回から同じ内容のクエリが要求された場合にキャッシュから応答する、クエリキャッシュという仕組みがあります。キャッシュから応答させることによってデータベースへアクセスする負荷を軽減し、また応答速度自体の向上も狙ったものです。
まずは、クエリキャッシュが利用されているか確認する。
mysql> show variables like ‘have_query_cache’;
次に、クエリキャッシュに関係する設定値を確認する。
mysql> show variables like ‘query%’;
mysql> show status like ‘Qcache%’;
そして、クエリキャッシュのヒット率を計算する。
キャッシュヒット率の確認
計算式=Qcache_hits/(Qchache_hits+Qchache_inserts+Qchache_not_cached)*100
そしてクエリキャッシュのヒット率によって対策を考える必要がある。
クエリキャッシュのヒット率が2割以下になるような場合は、却って遅くなる(1割程度遅くなる)のでクエリキャッシュを無効にしましょう。
クエリキャッシュのヒット率については、以下のサイトも参考になる。
Planet MySQL – Archives – オトコの近況 – ブログ停滞中のワケ
クエリキャッシュのヒット率はどのように計算すれば良いのでしょうか?ここで改めて説明するために、上の一覧ではクエリキャッシュについては敢えて省略しましたが、クエリキャッシュのヒット率は次の計算式で求めることが可能です。
Qcache_hits / (Qcache_hits + Com_select)
Qcache_hitsは文字通り、クエリキャッシュにヒットして、キャッシュからクライアントへ結果が送信された回数です。キャッシュミスが発生すると、MySQL ServerはSELECT文を実行してテーブルに対してクエリを行い、その際にCom_selectをカウントアップします。つまり、クエリキャッシュが有効になっている場合は、Com_selectがキャッシュミスをした回数を表すのです。SELECTを実行して結果を取得すると、クエリキャッシュへ結果がキャッシュされる場合と、結果セットが大きすぎる理由などによってキャッシュされない場合があります。キャッシュされた場合は Qcache_insertsがカウントアップされ、されなかった場合にはQcache_not_cachedがカウントアップされます。従って、次のような関係式が成り立つでしょう。
Com_select ≒ Qcache_inserts + Qcache_not_cached
これを上記の式に代入すると、クエリキャッシュのヒット率は次のように変形することが可能です。
Qcache_hits / (Qcache_hits + Qcache_inserts + Qcache_not_cached)
Com_selectは離れた位置にあるので、Qcache_%だけを見てヒット率が判断できるこの式を用いると便利でしょう。この式ならば「SHOW GLOBAL STATUS LIKE ‘Qcache%’」というコマンドでステータス変数を表示するだけで事足ります。
こういった情報をチェックしながら、クエリキャッシュの保守 を行う必要があります。クエリキャッシュは手軽で効果が高いチューニング手法だが、すべてのケースで有効というわけではないので注意。
query_cache_sizeが不足してないか?Qcache_lowmem_prunesが大きくなりすぎていないか?Qcache_free_blocksが大きくなって断片化が起こっていないか?などなど。