ある日、Percona Supportの顧客とMySQL 5.7の新機能について議論する機会があったのですが、その後、重要な機能をまとめたリストがあったらいいんじゃないかと考えました。最新のMySQL 5.7.6 リリース予定版(RC)が、素晴らしい機能を詰め込んで公開されたばかり。これがMySQL 5.7の重要機能一覧です。
レプリケーション機能の拡充
- MySQL 5.7の最重要機能の1つは、マルチソースレプリケーションでしょう。この機能では、スレーブに対して複数のマスタを指定でき、これまでのマスタが1台のみという制限がなくなります。同僚が書いたマルチソースレプリケーションについてのいいブログ記事(日本語訳)が役に立つはずです。
- MySQL 5.7から
SHOW SLAVE STATUS
がノンブロッキングになります。SQL_THREADで長く実行されているSQLクエリがあるとSTOP SLAVE
が終わるのを待っていましたが、その際もSHOW SLAVE STATUS
がすぐに結果を返します。付けくわえておくと、LOCK FREE SHOW SLAVE STATUS
の機能は、Percona Server 5.5で最初に実装されたものです。 SHOW SLAVE STATUS
の情報の全てがperformance_schemaのテーブルから取り出すことができるようになります。詳細はマニュアルを確認して下さい。- 新しく登場した
CHANGE REPLICATION FILTER
コマンドで、MySQLサーバを再起動させずにレプリケーションのフィルタを変更できます。 - MySQL 5.7以降では、
STOP SLAVE
でレプリケーションを止めなくてもCHANGE MASTER TO
を実行できます。詳細はマニュアルを確認してください。 - 新しい方法でパラレルレプリケーションが可能になります。1台のスレーブの1つのデータベース(スキーマ)内でも並列にトランザクションを適用できます。save_parallel_typeを確認してみて下さい。
- Global Transaction Identifiers (GTID)によって、レプリケーションのストリームからポジションを自動的に追跡できるようになります。また、MySQL 5.7からはgtid_modeが動的変数になるので、レプリケーショントポロジ内のMySQLの各サーバを同期し直したり再起動したりせずに、GTIDを有効にしたり無効にしたりできます。ちなみに、オンラインでGTIDの有効無効を変更できる機能はPercona Server 5.6で追加されています。この機能を使うと、マスタをread_onlyにしてスレーブのレプリケーションを止めることなく既存のレプリケーション構成にGTIDを適用できます。マスタのダウンなしにオンラインでGTID環境へ移行する流れについて、同僚のStephaneがブログ記事を書いているので確認してみて下さい。
InnoDBの改善
- InnoDBバッファプールをオンラインでサイズ変更できます。MySQL 5.7から、MySQLサーバを再起動しなくてもバッファプールのサイズ変更ができるように、
innodb_buffer_pool_size
は動的変数になりました。 - MySQL 5.7から、オンラインの
ALTER TABLE
でインデックス名の変更を行うRENAME INDEX
もサポートされます。この操作は、テーブルのコピーを行わずに実行されます。 - InnoDBは、パーティショニングされたテーブルでもTransportable Tablespaceをサポートします。この機能についての私のブログ記事が役に立つでしょう。
- Innochecksumコマンドに新しいオプションが増えています。これについても最近ブログ記事を書きました。
- MySQL 5.7では、InnoDBで「空間インデックス」をサポートします。また、
ALTER TABLE .. ALGORITHM=INPLACE
のように、このインデックスを追加するのにもオンラインDDLが使えます。 - InnoDBバッファプールのダンプとリロードの操作が改善されます。新しいシステム変数
innodb_buffer_pool_dump_pct
で、最近使ったページの何%までを各バッファプールから読み出してダンプするかを指定できます。
トリガ
- SQL標準に従ってMySQL 5.7では、テーブルごとにトリガイベント(DML)やタイミング(BEFORE, AFTER)に対して複数のトリガをサポートします。つまり、
INSERT
アクションに対して複数のトリガを付けるように、イベントごとに複数のトリガを作れます。
パフォーマンス改善
- MySQL 5.7のInnoDBでは、バルクデータロードが改善されます。InnoDBは、インデックスの作成や再作成時にバルクロードを実行します。これはソート済みインデックス構築と呼ばれインデックス操作を拡張するもので、FULLTEXTインデックスにも影響を与えます。
- 現在は、バッファプール内のダーティページのディスク書き込みに責任を持つページクリーナースレッドは、1つだけです。MySQL 5.7 InnoDBの並列ディスク書き込みでは、それぞれのバッファプールインスタンスのフラッシュリストやLRUリストに対して、別々のバックグラウンドスレッドがあるので、ディスク書き込み性能が改善されます。2スレッドでのディスク書き込みは、Percona Server 5.6で実装されたものであることも明記しておきます。
オプティマイザの改善
EXPLAIN FOR CONNECTION
を使うと、実行中のクエリの実行計画を確認できるようになります。クエリの最適化に重要な情報を取り出すことができるようになるのです。- MySQL 5.7では、
UNION ALL
の結果に対してテンポラリテーブルを作らないようになります。これにより、UNION
が大きな結果セットを生成する場合に、ディスクIOとディスク領域を節約するのに役立ちます。Morgan Tocker氏のブログ記事がよい情報源です。 - MySQL 5.6で、従来より詳しい情報を表示してくれる
EXPLAIN
のJSONフォーマットが登場しました。5.7のEXPLAIN
のJSONフォーマットでは、よい実行計画とそうでないものの差が分かりやすいように、クエリの総コストを表示してくれるように拡張されます。 - MySQL 5.7では、generated columnあるいはvirtual columnが新機能としてサポートされます。同僚のAlexanderがブログ記事で、その良さについて説明しています。
テストスイートの改善
- MySQLテストスイートは、デフォルトのストレージエンジンとしてInnoDBを使うようになります。それに合わせて、新しいテストが追加されるとともに、既存のテストはGTIDレプリケーションのテストスイートを含むように拡張されています。
セキュリティの改善
- MySQL 5.7から、パスワードの有効期限切れポリシーが使えるようになります。MySQLサーバに接続するユーザは全て、パスワード有効期限切れのライフサイクルを通ることになり、パスワードを変更する必要があります。詳しくはマニュアルを参照してください。
- データベース管理者は、ユーザアカウントをロックしたりロック解除したりできます。詳しくはマニュアルを参照してください。
- MySQL 5.7から、ランダムパスワードが設定され、パスワード有効期限が切れた状態の「root@localhost」の1ユーザだけを作成するようになります。つまり、インストール後は匿名アカウントは作られていない状態で、かつtestデータベースも存在しません。MySQLは、データディレクトリの初期化のタイミングでrootユーザのパスワードを設定した上で、有効期限切れ状態にし、標準出力にパスワードを表示します。
まとめ
ここに挙げたのは、MySQL 5.7の新機能のごく簡単なまとめです。あなたのお気に入りの機能をコメントに書いてくれても結構です。新しい機能がある一方で、非推奨になったり削除された機能もあります。それらを含め、マニュアルで全てを確認できます。