MySQLで、指定したときだけクエリキャッシュする

今までMySQLのクエリキャッシュはは有効にしてたんですが、Webサービスだとキャッシュヒットするようなクエリはそんなに多くないし、どこかで見かけたんですが(失念…)クエリキャッシュをオフにしたら(逆に)パフォーマンスが上がっただか負荷が下がっただかというのも目にしたので、今度クエリキャッシュはオフにしようと思ってました。(どのみちヒット率悪いし)

そんなとき、同僚に query_cache_type を教えてもらいました。(4.0からあるオプションなのに今まで知りませんでした。。。><)

てっきりクエリキャッシュはオンかオフかしかできないと思い込んでたんですが、"DEMAND" を指定すると、「原則キャッシュはしないが、SELECT SQL_CACHE ... と指定されたクエリはキャッシュを見る」というような挙動にできます。ステキですね。


さて、query_cache_type は動的に変更できる変数なので、

早速、変更してみました。

root@db109[(none)]> select @@global.query_cache_type;
+---------------------------+
| @@global.query_cache_type |
+---------------------------+
| ON                        |
+---------------------------+

root@db109[(none)]> set @@global.query_cache_type = "DEMAND";
Query OK, 0 rows affected (0.00 sec)

root@db109[(none)]> select @@global.query_cache_type;
+---------------------------+
| @@global.query_cache_type |
+---------------------------+
| DEMAND                    |
+---------------------------+

いい感じです。

忘れずに my.cnf にも追加しておこうと、

query_cache_type = DEMAND

と書いたところ、syntax errorで mysqld が起動しませんでした。。。ぎゃふん。

先のドキュメントを見ると、「Valid Values: 0, 1, 2」で「2 or DEMAND」と書いてあるので、

query_cache_type = 2

と指定するのが正解でした。

  • 教訓
    • 些細な変更でも動作チェックはちゃんと行う。
    • いきなり本番でやらない。まずはサービスに影響ない実験環境とかで。