MAMPで開発中のCakePHPベースのアプリ。どこかでキャッシュされてる?
MAMP上で開発してるCakePHPベースのアプリで、リロードすると読み込みが早くなる場合がありました。CakePHPのキャッシュの仕組みをちゃんと把握してなかったので、デフォルトで何か動いてるのかとか、もしくはMySQL側の方かとちょっと調べてみました。特に最近、データベースに入れたダミーデータが増えてきたので、リロード後の動作が速い事に気がつきました。実際に、CakePHPの echo $this->element('sql_dump'); で出力される、各クエリーの所要時間*1がかなり違っていたので、どうやらデータベース周りという見当で調べています。
今のところの結論
MySQL側
MAMPのMySQLは初期設定ではmy.confが存在しない。
そして have_query_cache=YES だけど、query_cache_size=0 なので、クエリーキャッシュは使われていない。
CakePHP側
CakePHPではモデルやクエリーはキャッシュされていない。
Model->cacheQueries プロパティが true だと、同じクエリーはキャッシュされるが、これは1リクエスト*2中に同じクエリーが発行される場合に有効な、メモリにキャッシュされるもの。しかも初期値は false です。
Cacheクラスは使うなら自分で明示的に読み書きをして使うものだし、この Cacheクラスを使ったビューキャッシュはコントローラーで使う事を明示する必要がある。
http://api13.cakephp.org/class/model
http://api13.cakephp.org/class/cache
なのでどこでキャッシュされてるのか、もしくはキャッシュ以外の何かで動作が速くなってるのか、まだ謎な状態です。単純にMySQLのデータが、最初のクエリーでメモリに乗っかって早くなってるとかなのかなぁ?
ついでに、MySQLのクエリーキャッシュを有効にしてみたら、何故か使われない様子。答えは出なかったけど、とりあえずここまで。
詳細
MAMP MySQL の my.conf
/Applications/MAMP/db/mysql/
MAMPのmy.confはこの場所に設置するものですが、MAMPの初期状態では存在しないようです。my.conf 無しでもMySQLって動くんですね、知りませんでした。
$ ls /Applications/MAMP/Library/share/mysql/my-* /Applications/MAMP/Library/share/mysql/my-huge.cnf /Applications/MAMP/Library/share/mysql/my-innodb-heavy-4G.cnf /Applications/MAMP/Library/share/mysql/my-large.cnf /Applications/MAMP/Library/share/mysql/my-medium.cnf /Applications/MAMP/Library/share/mysql/my-small.cnf
ちなみに、ここに my.conf のサンプルが置いてあります。用途にあわせて前述の場所にコピーして使うようです。拡張子が .conf じゃなくて .cnf ですけど、Macだから?
# The following options will be passed to all MySQL clients [client] #password = your_password port = 9999 socket = /Applications/MAMP/tmp/mysql/mysql.sock # Here follows entries for some specific programs # The MySQL server [mysqld] port = 9999 socket = /Applications/MAMP/tmp/mysql/mysql.sock
中を見るとポートが MySQLデフォルトの 3306 じゃなく 9999 に指定されてたので、そのまま読み込ませると困るかもしれません。
MAMP.app で設定する MySQL のポート番号との兼ね合いはどうなるんだろう?というより、ここでの設定が my.conf に書き込まれたりするんじゃないかと、なんとなく思ってたけど、my.conf が無いのでどういう事なんだろう?
MAMP MySQL のクエリーキャッシュ
mysql> SHOW VARIABLES LIKE 'have_query_cache'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | have_query_cache | YES | +------------------+-------+ 1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'query_cache_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | query_cache_size | 0 | +------------------+-------+ 1 row in set (0.00 sec)
こんな感じで、クエリーキャッシュは実質無効のようです
/Applications/MAMP/Library/bin/mysql
MySQLのクエリーキャッシュを有効にしてみた
mysql> SET GLOBAL query_cache_size = 41984; Query OK, 0 rows affected (0.00 sec) mysql> SHOW STATUS LIKE 'Qcache%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 33432 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 1 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+-------+ 8 rows in set (0.00 sec)
クエリーキャッシュを有効にし、直後のクエリーキャッシュのステータスです。
ここから、CakePHPベースのアプリの、indexページにブラウザから3回程アクセスしてみました。
mysql> SHOW STATUS LIKE 'Qcache%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Qcache_free_blocks | 2 | | Qcache_free_memory | 4408 | | Qcache_hits | 0 | | Qcache_inserts | 25 | | Qcache_lowmem_prunes | 11 | | Qcache_not_cached | 22 | | Qcache_queries_in_cache | 14 | | Qcache_total_blocks | 39 | +-------------------------+-------+ 8 rows in set (0.00 sec)
1回目。Qcache_inserts が 25になりました。
mysql> SHOW STATUS LIKE 'Qcache%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 4072 | | Qcache_hits | 0 | | Qcache_inserts | 50 | | Qcache_lowmem_prunes | 36 | | Qcache_not_cached | 43 | | Qcache_queries_in_cache | 14 | | Qcache_total_blocks | 38 | +-------------------------+-------+ 8 rows in set (0.00 sec)
2回目。Qcache_inserts が50になりました。何故か Qcache_hits が増えません。
mysql> SHOW STATUS LIKE 'Qcache%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Qcache_free_blocks | 2 | | Qcache_free_memory | 4528 | | Qcache_hits | 0 | | Qcache_inserts | 75 | | Qcache_lowmem_prunes | 62 | | Qcache_not_cached | 64 | | Qcache_queries_in_cache | 13 | | Qcache_total_blocks | 37 | +-------------------------+-------+ 8 rows in set (0.00 sec)
3回目。Qcache_inserts が75になりました。変わらず Qcache_hits が増えてません。理由は分かりませんが、クエリーキャッシュを有効にしても、何故か使われていないようです。
ちなみに、echo $this->element('sql_dump'); の出力結果も25個のSELECT文が確認出来るので、Qcache_inserts が25ずつ増えてるのはあってます。