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してくれるだけでもやや楽になったかな。