概要
データベースのメジャーバージョンがあがっても業務ですぐ採用とはならないと思いますが、
せっかく便利に進化しているのに、使わないのはもったいないということで。
とりあえず、内容だけ把握しておいて使えるチャンスを待とうというスタンスでまとめました。
もちろん公式に特徴の記載はありますが、「〜が高速!」とかは、使用する環境とかに依存すると思うのであまり注目していません。
「できるようになったこと」「できなくなったこと」のほうが興味があるし、実際にデータベース選定時の判断基準にもなるはずです。
以下そういう観点で過去のバージョンと比較した内容を記載しています。
MySQL8.0でできるようになったこと
CTE(Common Table Expressions):With句が使用可能に
もともとPostgreSQLを使っていた身としてはwith句が使えてSQL書く際にネスト地獄を解消できて嬉しいですね。
(他のRDBではすでに実装されていましたが、MySQLはこれまで実装されていませんでした。)
SQLをエディタで書いていると、一応改行やスペースで見やすい形で書くようにはしてましたがネストが続くとどうしてもテーブルの見通しが悪くなるのでありがたいです。
Window関数が使用可能に
集計時とかに使うと複雑なSelectを簡潔にSQLで実現できて便利ですよね。
個人的にはFIRST_VALUE()やRANK()が便利でこれまでにもお世話になっています。
RDB初心者?というかなれていない人からすると「Window関数なにそれ?言ってることがよくわかんない」ってなりやすいので(昔の自分はそうでした。)、安直に多用するのは問題かもしれません。
権限管理がロール単位で可能に
運用保守担当者というかサーバ・インフラ管理を明確にしている場合はかなり便利ですよね。
複数のユーザやシステムが同じデータベースを利用する際に、いちいちユーザごとに権限設定すると事故が起きやすいと思うので助かりますね。むしろなぜ今までなかったのか。
ドキュメントストアが追加
これによってNoSQLドキュメントデータベースを別に用意する必要がなくなります。
RDBにNoSQLDBの機能が追加されましたっていうイメージですが、どこまで実用的なのかはまだ不透明だと思っています。
一見両方の機能を1つのデータベースで管理できて負担が減りそうですが、規模が小さい場合やお試しの場合はともかく、結局MySQL+Cassandraみたいにそれぞれわけたほうが、実運用向きなのではないかと。
RDBとNoSQLDBでそれぞれ役割が異なるはずなので、それぞれ分業したほうがシステム全体のパフォーマンスは上がると思います。
JSONサポート強化
JSONデータを受け取り、それをリレーショナルテーブルとして返すJSON_TABLE関数などが追加されました。
JSONデータを取り扱わないシステムっていうのも珍しくなってきているので必然かもしれませんが、個人的にココらへんはまだ使いこなせていないため、感動は薄いです。
(MySQLで無理してjsonしなくても、他のNoSQLDBを並行で使うのでもよいかなあと。そもそもRDBに保存するならjsonをパースして必要な値をそれぞれ適切な型で保存したほうが管理しやすい気がします)
GIS(Geographic Information System ): SRS(Spatial Reference Systems)をサポート
緯度経度を使ってマップ上にポイントしたりすることはよくあるので、位置の計算や管理がしやすくなるのはいいことですよね。便利そうなのはわかっていますが、こちらも使いこなせていないため、感動は薄いです。
(便利な例があれば知りたいです。)
MySQL8.0でできなくなったこと
クエリーキャッシュ廃止
実行したSQLとその結果をメモリ上にキャッシュしておいて、同じSQLが実装された場合に使用することで高速化できるやつですが、廃止されたようです。
新しく利用する場合は問題ないかもしれませんが、バージョンアップした場合で、過去のバージョンでこの機能を使用していた場合に起動しなくなるらしいです。
これ知らないとはまりそうです。
古いTIME型やTIMESTAMP型の廃止
古いTIME型やTIMESTAMP型が廃止されたみたいで、もし該当する場合は型の変更が必要みたいです。(参考)
感想
MySQL5.6→MySQL5.7への変更でもだいぶ慎重になっている自分なので、MySQL8.0の実践投入はいつになるかわかりませんが、なるべく早く使ってみたいです。
しばらくはローカル環境の趣味アプリで使うレベルでとまったまま、気づいたら新しいバージョンでることになりそうです。