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

ちなみにMAMPのコマンドラインのクライアントはここにあります。mysqlc じゃなくて 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ずつ増えてるのはあってます。

環境

Mac Mac OS X 10.5.8(Leopard)
MAMP 1.7.2
CakePHP 1.3.6
php 5.2.6
MySQL 5.0.41

*1:Took (ms)

*2:ブラウザからの1リクエスト