MySQLのクエリキャッシュ
ご無沙汰しております。とっしぃです。
私事になりますが5月末に結婚しました(๑╹ڡ╹๑)
式が終わって6月頭にちょっとした旅行、8月に引っ越しと、
未だかつてないバタバタ具合で行っておりました。
なのでこのブログ(ただのメモですけど)もだいぶ滞ってしまいました(´・ω・`)
色々と一段落はしたので、またちょこちょこと更新していこうと思います。
その一発目として、今までめんどくさそうと思ってあんまり手を出してこなかったMySQLのクエリキャッシュについてのメモでも。
クエリキャッシュで何ができるのか
MySQLのクエリキャッシュでは、発行されたSQLのうち、SELECTステートメントのテキストを結果と共に格納します。
全く同じクエリを受け取った際には、その格納されたクエリキャッシュの中から結果を返し、一からクエリの解析や実行を行いません。
クエリキャッシュの設定
まずは現在クエリキャッシュが有効かどうかを調べます。
mysql> show variables like 'query_cache_%';
もしくは
# mysqladmin -uroot -p variables | grep query_cache
その結果のうち、
query_cache_size
を見て、値が 0 でなければ有効な状態です。
これが 0 だった場合にはこれを設定しなければなりません。
Linuxで一般的な設定ファイルの場所である
/etc/my.cnf
の [mysqld]セクションに、
query_cache_size=16M
と記述し、mysqlを再起動します。
値は環境によって変わりますが、後々稼働状況を見て変更していくのでもいいと思います。
query_cache_size以外にも、
query_cache_limit
query_cache_min_res_unit
と言った項目も設定できます。
query_cache_limitはキャッシュする結果のサイズ上限を、
query_cache_min_res_unitはキャッシュするデータのブロック単位サイズを表します。
参考:
[ThinkIT] 第6回:query_cache_sizeの違いによるパフォーマンス比較 (1/3)
MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.12.3 クエリ キャッシュの設定
効果測定
mysql> show status like 'Qcache%';
もしくは
# mysqladmin -uroot -p extended-status | grep Qcache
などとして、現在のキャッシュ状態を確認します。
Qcache_free_blocks 1 空きブロック数 Qcache_free_memory 5489800 空きメモリサイズ(バイト) Qcache_hits 1944 クエリヒット数 Qcache_inserts 649 キャッシュされたクエリ数 Qcache_lowmem_prunes 0 メモリが足りずにキャッシュから削除されたクエリ数 Qcache_not_cached 171 キャッシュされなかったクエリ数 Qcache_queries_in_cache 649 キャッシュされているクエリ数 Qcache_total_blocks 1353 キャッシュ内のブロック数
これのうち、
Qcache_free_memory
Qcache_lowmem_prunes
を見ることで、キャッシュを必要としているクエリとそのクエリに対するメモリサイズが分かります。
これにより、必要に応じてキャッシュサイズの増減を行います。