Lapis Lazuli

technical blog for web developer

MySQL5.6がEOLに

まだまだ使っているところが多いと思われるMySQL5.6が2021年2月のEOLになります。

www.mysql.com

意外に早いなーと思いましたが、ExtendedSupportはGAから8年なので、リリースされたのは2013年なんですね。
移行するのでしたら、5.7は2023年10月までいけるので、こちらに乗り換えるか、思い切って最新の8にするかの選択肢になると思います。8なら2026年まで大丈夫ですしね。

5.7にして特に下記が使えるようになるのが大きいでしょうか。
JSON型のサポート
全文検索での日本語サポート

JSON型のサポート

カラムの型にJSON型を使うことができるようになります。
5.6まででJSONを格納しようと思ったら、そのまま文字列としてVACHARに格納して取り出したときにパースする使い方でした。
これでも一応使えるのですが、検索したいときとかは毎回展開する必要があるので面倒でした。
JSON型を使うときはテーブルの型をJSONにするだけです。
検索するときなどは関数を使い、keyとvalueを指定して取ってくることができます。

mysql> SELECT * FROM `json_table` WHERE JSON_CONTAINS(column_name, '"value"',  "$.key");

上記はJSON_CONTAINS関数で特定のkeyに設定してあるvalueを検索する方法です。
他にもJSON_EXTRACTで件数取得したりとJSON関数は色々と使えます。ただフレームワークを使用していてJSONを扱う機能があるのならそっちを使うほうが良いパターンはあります。

全文検索での日本語サポート

これはその名の通り、日本語で全文検索ができるようになりました。
5.6でも全文検索はできたのですが、英語など言語が限られていましたが、新たに日本語パーサーを搭載することで実現しました。
全文検索を使うにはFULLTEXTインデックスを貼ってパーサーの指定を行う必要があります。

ALTER TABLE table_name ADD FULLTEXT INDEX n_gram_idx (column_name) WITH PARSER ngram;

上記ではパーサーにN-gramを指定しましたがMeCabも使えます。
実際に検索するときはMATCH AGAINST関数を使います。

SELECT * FROM table_name WHERE MATCH (column_name) AGAINST ('文字列');

検索モードを指定すると細かく条件を指定し、これによって検索結果が変わってきます。
デフォルトだとIN NATURAL LANGUAGE MODEになっており、他のモードを使ったときの挙動は次回独立した記事で検証してみます。

Auroraの場合

AWSの場合、RDSでAuroraを使っているケースもあると思いますが、Auroraの5.6は特にEOLとかはアナウンスされていないようです。
あくまでも互換で、AWS独自の実装が多いので、公式に発表されるまでは大丈夫かなと思います。
そもそもAuroraは5.6と5.7の差が本家ほど多くないです・・・先行して実装してしまっているものも多いので。