MySQLのクエリキャッシュ設定
Category
Server
MySQLのバージョン4.0.1以降には、クエリキャッシュという機能があります。
クエリキャッシュには、SELECTクエリのテキストとクライアントに送られた結果が格納され、以後同じクエリを受け取った際、クエリの解析と実行を行わず、クエリキャッシュから結果を取り出します。同じクエリが何度も実行される環境下では、クエリキャッシュを使う方が効率的で、かつパフォーマンスを向上させることができます。
今回は、MySQLのクエリキャッシュ設定について紹介します。
Keyword:MySQL,クエリキャッシュ,高速化
MySQLのクエリキャッシュ設定
MySQLのデフォルト設定では、クエリキャッシュの設定は無効になっていますので、my.cnfで有効にしてやります。
my.cnf
# viコマンドでmy.cnfを編集 vi /etc/my.cnf # 以下を追記 [mysqld] query_cache_limit=1M query_cache_min_res_unit=4k query_cache_size=24M query_cache_type=1 # MySQLを再起動 /etc/init.d/mysqld restart
補足
●以下を追記
[query_cache_limit=1M]
キャッシュの上限(これ以上の結果はキャッシュしません)。
デフォルト値は1MB。
[query_cache_min_res_unit=4k]
MySQLのバージョン4.1以降で利用できる変数。
メモリの割り当て処理はコストが高いため(時間的に)、クエリキャッシュでのブロックの割り当ては、ここで指定された最小サイズで行われます。
デフォルト値は4KB(ほとんどの場合、これで十分だと思います)。
[query_cache_size=24M]
クエリキャッシュに割り当てるメモリサイズ。
デフォルト値は0(この値を0にするとクエリキャッシュは無効になります)。
※環境に合わせて設定してください。
[query_cache_type=1]
0でOFF設定。
⇒キャッシュの格納・結果の取り出しを行いません。
1でON設定。
⇒SELECT SQL_NO_CACHEで始まるステートメント以外をキャッシュします。
2でDEMAND設定。
⇒SELECT SQL_CACHEで始まるステートメントだけをキャッシュします。
デフォルト値は1。
クエリキャッシュを有効にするだけの場合、”query_cache_size”のみをmy.cnfに追記しても構いません(※その他の値はデフォルト値が使用されます)。
後々変更する可能性がある場合、上記のようにデフォルト値を設定しておくと変更が簡単です(※コマンドでMySQLサーバーに接続してから設定することも可能ですが、my.cnfに追記する方が楽です)。
●MySQLを再起動
設定を反映させるため、MySQLを再起動します。
次に、MySQLサーバーに接続し、クエリキャッシュの状況を確認します。
MySQL
# MySQLサーバーに接続 mysql -u ユーザー名 -p データベース名 Enter password: # クエリキャッシュが有効か確認 show variables like 'query_cache_%'; +------------------------------+---------+ | Variable_name | Value | +------------------------------+---------+ | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 25165824| | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+---------+ # キャッシュ状況を確認 show status like 'Qcache%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 230 | | Qcache_free_memory | 24499144 | | Qcache_hits | 11745 | | Qcache_inserts | 13136 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 805 | | Qcache_queries_in_cache | 412 | | Qcache_total_blocks | 1070 | +-------------------------+----------+ # キャッシュのクリア reset query cache; # MySQLサーバーを切断 exit
補足
●MySQLサーバーに接続
mysqlコマンドを使用しますので、MySQLサーバーに接続します。
※MySQLクライアントを起動すると、プロンプトが”mysql>”となります。
続けてパスワードを入力します。
※パスワードは表示されませんので、入力後Enterキーを押します。
●クエリキャッシュが有効か確認
“query_cache_size”が0でなければ、有効になっています。
※今回は24MBで設定しました。
●キャッシュ状況を確認
クエリキャシュされているか確認するコマンドです。
[Qcache_free_blocks]
クエリキャッシュの空きブロック数。
[Qcache_free_memory]
クエリキャッシュの空きメモリサイズ。
[Qcache_hits]
キャッシュヒット数。
[Qcache_inserts]
キャッシュに加えられたクエリ数。
[Qcache_lowmem_prunes]
メモリ不足によりキャッシュから削除されたクエリ数。
この値が大きい場合、”query_cache_size”が不足していると考えられるので、キャッシュサイズを増やすことでキャッシュ効率を上げる事ができます。
[Qcache_not_cached]
キャッシュされなかったクエリ数。
SQL_NO_CACHEキーワード付きでSQLが発行されたり(“query_cache_type”がONの場合)、結果が”query_cache_limit(デフォルト値は1MB)”より大きい場合等、クエリ結果はキャッシュされません。
[Qcache_queries_in_cache]
キャッシュに登録されているクエリ数。
[Qcache_total_blocks]
クエリキャッシュの総ブロック数。
●キャッシュのクリア
キャッシュをクリアする場合のコマンドです。
効果測定等をしたい場合に使用します。
「クエリキャッシュから古いデータが返ってくることはないの?」といったように思いますが、データが変更されると、クエリキャッシュに関連するエントリはフラッシュされますので、データは更新されます。
●MySQLサーバーを切断
MySQLサーバーを切断します。
※キャッシュはSELECT文にのみ適用されます。
※MySQL4.1以前では”SELECT”の前にスペースがあると、クエリキャッシュは有効になりません。
関連記事(※当記事と関連性が高いと思われる記事)
MySQLの設定変更
2012/08/04CentOSにPHP5.3をインストール
2012/04/04よく使うLinuxコマンドの覚え書き
2012/01/29WordPressの検索表示をカスタマイズする
2012/03/11.htaccessでよく使う設定
2011/12/22おすすめ書籍・商品(※当記事と関連性が高いと思われる書籍・商品)