MySQL5.1 Barracudaオプションを試す【MySQL】
レプリケーションによるバージョンアップがちゃんと動くことが確認できたので、今回はMySQL5.1の新機能であるBarracudaによるデータベース圧縮を試すことにする。
リリース直前に5.5がGAになったのだが、今更導入は間に合わない。よって今回の業務ではMySQL5.1.54のまま進めることにしました。
ところで僕の作ってるWEBアプリのメイン業務はトラッキングのログを抽出すること。
逐一取ってるアクセスログは当然溜まっていく一方なので、DBのデータボリュームを少しでも少なくしたい。幸いMySQLにはファイル圧縮という素晴らしい機能があるので、当然InnoDB Pluginも入れておく。
拝読させていただいてるブログを参考に、my.cnfにInnoDB Pluginの設定を追記。
MySQLを起動して入ってるのを確認。[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
おお、1.0.12にいつの間にバージョンが上がっていた。mysql> select @@innodb_version;
- ------------------+
@@innodb_version
- ------------------+
1.0.12
- ------------------+
1 row in set (0.00 sec)
さて、これだけでは新機能であるBarracudaオプションによるファイル圧縮が有効にはならない。my.cnfにさらに設定を追記する必要がある。
mysqlを再起動。
圧縮前に対象テーブルのレコード数を確認やー!
2011年01月の時点で1000万件のレコード。一年に1億2000万レコードかあ。。。。mysql> select count(*) from daylog201101;
- ----------+
count(*)
- ----------+
10244334
- ----------+
1 row in set (12.14 sec)
こいつのデータサイズを見てみると…
# ll daylog201101*
ウホッ!4GB超あった。こんなの毎月取ってたらたまんないよね。
では早速このテーブルを圧縮しちゃいましょう。
待つこと数十分。ALTERかけると退避のためにメモリを食っちゃうので、充分なメモリサイズが確保できなそうな場合はmysqldumpしてtrancateして入れなおしたほうがよさそう。ALTER TABLE daylog201101 ROW_FORMAT=Compressed;
さて、ALTER完了。どれどれデータサイズはというと…
# ll daylog201101*
何と!半分近くにサイズダウンしてる!素晴らしい!
単純計算で2倍のデータが入ることになるね^^。すごいなMySQL。すごいなInnodb Plugin。
気になる性能はこちらにまとめた方がいらっしゃるのでご確認。
圧縮機能はそれほど速度低下はないけどCPU負荷がかかるので、利用するマシンの選定はご注意ください。
データによってはこれほどのサイズダウンは見込めないかも知れないけど、アクセスログみたいな単純なデータの格納であれば使って損はないかも。というかデフォルトで使ったほうがいいと思う。