読者です 読者をやめる 読者になる 読者になる

CreateField Blog

オープンソースを使って個人でWebサービスを開発・運営していたブログ

MySQLでgenerated columnを使って圧縮したデータを自動的に解凍する

MySQL5.7でできたgenerated columnってどんなのかな〜って調べていると、参照時に所定の計算結果を反映してから取得する仮想カラムVIRTUALと、更新時に所定の計算結果後の値を格納してくれるSTORED(Mariaの場合PERSISTENT)があることがわかりました。

MySQLでカラムごとに圧縮する方法 - CreateField Blog

こちらの記事ではCOMPRESS関数とUNCOMPRESS関数を使ってMySQLでカラム単位でデータを圧縮する方法を書きました。

これのCOMPRESSとUNCOMPRESSを自動的にやってくれる仮想カラムつくれるんじゃないのと思って試してみました。

MariaDB [comp]> CREATE TABLE comp (
    ->   compressed_body longblob NOT NULL,
    ->   body LONGTEXT GENERATED ALWAYS AS (UNCOMPRESS(compressed_body)) VIRTUAL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

MariaDB [comp]> INSERT comp(compressed_body) VALUES(COMPRESS("hoge hoge hoge hoge hoge hoge"));
Query OK, 1 row affected (0.01 sec)

MariaDB [comp]> SELECT body FROM comp;
+-------------------------------+
| body                          |
+-------------------------------+
| hoge hoge hoge hoge hoge hoge |
+-------------------------------+
1 row in set (0.01 sec)

自動的にUNCOMPRESSしてくれた。

MariaDB [comp]> CREATE TABLE comp (
    ->   body LONGTEXT NOT NULL,
    ->   compressed_body LONGBLOB GENERATED ALWAYS AS (COMPRESS(body)) PERSISTENT
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

MariaDB [comp]> INSERT comp(body) VALUES("hoge hoge hoge hoge hoge hoge");
Query OK, 1 row affected (0.00 sec)

MariaDB [comp]> SELECT UNCOMPRESS(compressed_body) FROM comp;
+-------------------------------+
| UNCOMPRESS(compressed_body)   |
+-------------------------------+
| hoge hoge hoge hoge hoge hoge |
+-------------------------------+
1 row in set (0.00 sec)

自動的にcompressしてくれた。

MariaDB [comp]> CREATE TABLE comp (
    ->   body LONGTEXT NOT NULL,
    ->   compressed_body LONGBLOB GENERATED ALWAYS AS (COMPRESS(body)) PERSISTENT,
    ->   uncompressed_body LONGBLOB GENERATED ALWAYS AS (UNCOMPRESS(compressed_body)) VIRTUAL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ERROR 1900 (HY000): A computed column cannot be based on a computed column

繋げることはできなかった。

片手落ちだけど、自動的にuncompressしてくれるだけでもやや楽になったかな。