動かざることバグの如し

近づきたいよ 君の理想に

MySQLの圧縮機能 COMPRESSEDを試す

環境

  • 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は試せなかった(