| 2010年07月03日 |
MySQLのチューニング(クエリキャッシュ)
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が大きくなって断片化が起こっていないか?などなど。
以下は、「MySQLのチューニング(クエリキャッシュ)」の関連エントリーです。
この記事を読んだ人はこんな記事も読んでいます
- 小さなヒマワリ (1092 hits)
- 帯域制限と接続数制限 - Apache (822 hits)
- 同時接続数(MaxClients)をいくつに設定すべきか? (189 hits)
- 東京ファイティングキッズ・リターン (76 hits)
- PHPの閉じタグは閉じなくて良いじゃなくて、閉じてはいけない! (56 hits)
- MySQLのチューニング(インデックス&SQL) (36 hits)
- MySQLのパラメータチューニングを助けてくれるツール (35 hits)
- MySQLのチューニング(インデックス&SQL) 続き (31 hits)
- PHPでCSVデータを出力する方法 (19 hits)
- MySQLのパラメータチューニング (19 hits)
- 実践ハイパフォーマンスMySQL (18 hits)
- MySQL Migration Toolkit というデータベース移行ツール (17 hits)
- フロントエンドのパフォーマンスチューニング - Expiresヘッダ追加 (17 hits)
- Apacheの同時接続数とPostgresqlの同時接続数について (16 hits)
- 定期的にバックアップを取りましょう!まじで! (13 hits)
- Apacheの負荷監視なら mod_status (13 hits)
- 純金ETF(金の果実)は、現物金へ交換できるみたい (12 hits)
- Linux-DB システム構築/運用入門 (11 hits)
- 「複数CPUならload averageはCPU数で割れ」は正しいか?(つづき) (10 hits)
- セッションハイジャック と session_regenerate_id( )関数 (10 hits)
約1年前!去年の今日はこんな記事を書いてました!