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

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お待ちしております。


名無しのエンジニア
iPhone実機でUnityを動かしてみた
Unityでお絵描きしてみる