MySQL5.1 Barracudaオプションを試す【MySQL】

レプリケーションによるバージョンアップがちゃんと動くことが確認できたので、今回はMySQL5.1の新機能であるBarracudaによるデータベース圧縮を試すことにする。
リリース直前に5.5がGAになったのだが、今更導入は間に合わない。よって今回の業務ではMySQL5.1.54のまま進めることにしました。
ところで僕の作ってるWEBアプリのメイン業務はトラッキングのログを抽出すること。
逐一取ってるアクセスログは当然溜まっていく一方なので、DBのデータボリュームを少しでも少なくしたい。幸いMySQLにはファイル圧縮という素晴らしい機能があるので、当然InnoDB Pluginも入れておく。
拝読させていただいてるブログを参考に、my.cnfにInnoDB Pluginの設定を追記。

[mysqld]
ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so

MySQLを起動して入ってるのを確認。

mysql> select @@innodb_version;

  1. ------------------+
@@innodb_version
  1. ------------------+
1.0.12
  1. ------------------+

1 row in set (0.00 sec)

おお、1.0.12にいつの間にバージョンが上がっていた。

さて、これだけでは新機能であるBarracudaオプションによるファイル圧縮が有効にはならない。my.cnfにさらに設定を追記する必要がある。

[mysqld]
innodb_file_per_table
innodb_file_format=Barracuda

mysqlを再起動。

圧縮前に対象テーブルのレコード数を確認やー!

mysql> select count(*) from daylog201101;

  1. ----------+
count(*)
  1. ----------+
10244334
  1. ----------+

1 row in set (12.14 sec)

2011年01月の時点で1000万件のレコード。一年に1億2000万レコードかあ。。。。
こいつのデータサイズを見てみると…

# ll daylog201101*

  • rw-rw---- 1 mysql mysql 14764 Feb 19 10:33 daylog201101.frm
  • rw-rw---- 1 mysql mysql 4097835008 Feb 19 11:06 daylog201101.ibd

ウホッ!4GB超あった。こんなの毎月取ってたらたまんないよね。
では早速このテーブルを圧縮しちゃいましょう。

ALTER TABLE daylog201101 ROW_FORMAT=Compressed;

待つこと数十分。ALTERかけると退避のためにメモリを食っちゃうので、充分なメモリサイズが確保できなそうな場合はmysqldumpしてtrancateして入れなおしたほうがよさそう。
さて、ALTER完了。どれどれデータサイズはというと…

# ll daylog201101*

  • rw-rw---- 1 mysql mysql 14764 Feb 21 12:06 daylog201101.frm
  • rw-rw---- 1 mysql mysql 2151677952 Feb 21 12:09 daylog201101.ibd

何と!半分近くにサイズダウンしてる!素晴らしい!
単純計算で2倍のデータが入ることになるね^^。すごいなMySQL。すごいなInnodb Plugin。
気になる性能はこちらにまとめた方がいらっしゃるのでご確認。
圧縮機能はそれほど速度低下はないけどCPU負荷がかかるので、利用するマシンの選定はご注意ください。
データによってはこれほどのサイズダウンは見込めないかも知れないけど、アクセスログみたいな単純なデータの格納であれば使って損はないかも。というかデフォルトで使ったほうがいいと思う。