MySQLのクエリーキャッシュの中身を確認するライフハック

こんにちは、DBAのたなかです。
MariaDB 10.0.2 Alphaに追加された新機能の1つとして
information_schemaプラグインのQUERY_CACHE_INFOというものがあります。
(その後、MariaDB 5.5.31にもバックポートされました。
http://blog.mariadb.org/mariadb-5-5-31-now-available/)
これがどんな情報を表示できるかというと、
mysql55> SELECT * FROM information_schema.query_cache_info LIMIT 5; +------------------+-------------------------------------------------------------+---------------------+--------------------+-------------------------+ | STATEMENT_SCHEMA | STATEMENT_TEXT | RESULT_BLOCKS_COUNT | RESULT_BLOCKS_SIZE | RESULT_BLOCKS_SIZE_USED | +------------------+-------------------------------------------------------------+---------------------+--------------------+-------------------------+ | tpcc | SELECT i_price, i_name, i_data FROM item WHERE i_id = 14071 | 1 | 512 | 319 | | tpcc | SELECT i_price, i_name, i_data FROM item WHERE i_id = 38324 | 1 | 512 | 310 | | tpcc | SELECT i_price, i_name, i_data FROM item WHERE i_id = 81920 | 1 | 512 | 312 | | tpcc | SELECT i_price, i_name, i_data FROM item WHERE i_id = 55298 | 1 | 512 | 316 | | tpcc | SELECT i_price, i_name, i_data FROM item WHERE i_id = 55294 | 1 | 512 | 308 | +------------------+-------------------------------------------------------------+---------------------+--------------------+-------------------------+ 5 rows in set (0.02 sec)
この通り、ストアされているクエリーキャッシュの情報(サイズ, SQLステートメント)が一覧で取れます。
これを定期的にとっておけば、クエリーキャッシュの分布とか効いてて欲しいクエリに効いてるかどうかとか判定できそう。
ネタや実装は結構前からあった気がするんですが、どこが初出かはイマイチはっきりしませんでした。ま、いいや。
さて、これをMySQLで使えるようにちょこちょこコードをいじります。
いくつかMariaDBにしかないマクロが定義されていたり、inline関数が普通の関数として定義されていたりするので、
さすがにこのままでは動かないのです。
MariaDB(5.5.31, 10.0.2, or later)のソースコードとMySQLのソースコードがある体です。
取り敢えずMySQL 5.5.32でだけ動作確認しました。5.5系ならそのまま動くと思います。
当てているパッチはGithubに上げてありますので、MySQLのソースコードのトップディレクトリに置いておいて下さい。
(https://github.com/yoku0825/qc_info)
$ ls -l mariadb-10.0.2/plugin/qc_info 合計 12 -rw-r--r-- 1 ttanaka ttanaka 178 4月 23 13:13 2013 CMakeLists.txt -rw-r--r-- 1 ttanaka ttanaka 7482 4月 23 13:13 2013 qc_info.cc $ cp -r mariadb-10.0.2/plugin/qc_info mysql-5.5.32/plugin $ cd mysql-5.5.32 $ cmake . .. $ patch -p0 < qc_info.patch $ cd plugin/qc_info $ make .. $ ls -l 合計 188 drwxrwxr-x 3 ttanaka ttanaka 4096 6月 20 17:34 2013 CMakeFiles -rw-r--r-- 1 ttanaka ttanaka 178 6月 20 17:34 2013 CMakeLists.txt -rw-rw-r-- 1 ttanaka ttanaka 8470 6月 20 17:34 2013 Makefile -rw-rw-r-- 1 ttanaka ttanaka 2858 6月 20 17:34 2013 cmake_install.cmake -rw-r--r-- 1 ttanaka ttanaka 8016 6月 20 17:38 2013 qc_info.cc -rwxrwxr-x 1 ttanaka ttanaka 157311 6月 20 17:38 2013 query_cache_info.so
これで完成。
できあがった.soファイルをMySQLのplugindirにコピーします。
$ sudo cp query_cache_info.so /usr/lib64/mysql/plugin
プラグインを認識させます。
mysql> INSTALL PLUGIN query_cache_info SONAME 'query_cache_info.so';
これで、information_schemaにQUERY_CACHE_INFOテーブルが出来上がります。
適度に遊べますが、
- 当然ながらNo Warrantyです。
- 情報を取る(SELECTした)時に、クエリーキャッシュロックを取ります。
- BSDライセンスです。原著作者は私ではないです。私はパッチ部分のみ。
な感じなのでご注意下さい。
開発環境にでも仕込んでみようと思います。
ちなみに、MariaDBのMDEVに既にこのプラグインの更新が上がっているため、
次のリリース以降パッチは作り直しになりそうです(´・ω・`)
Pull-requestお待ちしております。