とっしぃのTech Memo

PHPとかサーバとか他色々言語のメモ的な。あとはたまにガジェットとか。

MySQLのクエリキャッシュ

ご無沙汰しております。とっしぃです。


私事になりますが5月末に結婚しました(๑╹ڡ╹๑)
式が終わって6月頭にちょっとした旅行、8月に引っ越しと、
未だかつてないバタバタ具合で行っておりました。


なのでこのブログ(ただのメモですけど)もだいぶ滞ってしまいました(´・ω・`)


色々と一段落はしたので、またちょこちょこと更新していこうと思います。


その一発目として、今までめんどくさそうと思ってあんまり手を出してこなかったMySQLのクエリキャッシュについてのメモでも。


クエリキャッシュで何ができるのか

MySQLのクエリキャッシュでは、発行されたSQLのうち、SELECTステートメントのテキストを結果と共に格納します。
全く同じクエリを受け取った際には、その格納されたクエリキャッシュの中から結果を返し、一からクエリの解析や実行を行いません。

参考:
MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.12 MySQL クエリ キャッシュ

クエリキャッシュの設定

まずは現在クエリキャッシュが有効かどうかを調べます。

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

を見ることで、キャッシュを必要としているクエリとそのクエリに対するメモリサイズが分かります。
これにより、必要に応じてキャッシュサイズの増減を行います。


おわりに

今まではWebアプリのパフォーマンスといえば、まずはアプリケーションの作り、次にWebサーバ(Apache、Nginx)の設定辺りでなんとかなってきたんですが、
ここにきてやっぱりMySQLのチューニングって大切なんやな(´・ω・`)ということがよく分かりました。

この業界の第一線で戦う諸兄方にとっては今更かよと言った内容だと思いますが、そこにこうやって少しずつでも近づいていけるように
これからも貪欲に知識・経験を吸収していかないとなーと思った次第です。