環境
- ubuntu server 16.04
- MariaDB 10
- 検証に使ったデータはTwitterのサンプルストリーミングから取得したデータを使用
- testdata1 未圧縮
- testdata2 中身はtestdata1と同じだが圧縮済み
圧縮が使えるように設定
まずは設定を確認
MariaDB [(none)]> show variables like 'innodb_file%'; +--------------------------+-----------+ | Variable_name | Value | +--------------------------+-----------+ | innodb_file_format | Barracuda | | innodb_file_format_check | ON | | innodb_file_format_max | Barracuda | | innodb_file_per_table | ON | +--------------------------+-----------+ 4 rows in set (0.00 sec)
innodb_file_per_tableが有効で innodb_file_formatが「Barracuda」になってなければならない。
なってない場合はmy.cnfにて
innodb_file_per_table = 1 innodb_file_format = Barracuda
を追加してMySQLを再起動
圧縮の有効化
くっそ簡単。通常のcreate table構文にROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8
をつけるだけ
CREATE TABLE `testdata1` ( **** ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
すでにあるテーブルに対して圧縮機能を有効化する場合は以下
ALTER TABLE test ROW_FORMAT=Compressed KEY_BLOCK_SIZE=8;
容量
# du -ch testdata1* 8.0K testdata1.frm 673M testdata1.ibd 673M 合計
# du -ch testdata2* 8.0K testdata2.frm 321M testdata2.ibd 321M 合計
大体2分の1程度まで減ってる すごい
ベンチマーク
単純に limitを付けただけの場合のを1000回繰り返した場合
user system total real testdata1 255.690000 11.370000 267.060000 (326.304830) testdata2 235.230000 9.600000 244.830000 (295.826843)
なんとtestdata2の圧縮したほうが速い
インデックスの効いたwhere句を30000回繰り返した場合
user system total real testdata1 23.390000 2.320000 25.710000 ( 54.533738) testdata2 22.520000 2.090000 24.610000 ( 53.656592)
ほぼ同じ。。だがわずかに圧縮済みの方が速い
インデックスの効かないwhere句を10回繰り返した場合
user system total real testdata1 23.750000 2.620000 26.370000 (271.853630) testdata2 23.980000 2.550000 26.530000 (321.524997)
こっちは圧倒的に未圧縮のほうが速い
結論
- 圧縮すると約半分までデータ容量は減る
- 型によって変わるから一概には言えないが
- 圧縮した場合、indexの効かないwhereは遅くなる
- が、それ以外はそうでもない
- insert,updateは試せなかった(