MySQL道普請便り

第260回MySQL 9.4と9.5の新機能について

MySQLのInnovation ReleaseとなるMySQL 9.4とMySQL 9.5がリリースされました。今回は、その中からMySQL Community Editionで利用できる新機能や変更点をいくつかピックアップして、簡単に紹介したいと思います。

MySQL 9.4の新機能

最初に、MySQL 9.4の新機能と変更点について紹介します。

JSON Duality View のサポート

MySQL 9.4では、⁠JSON duality views」と呼ばれる新しい種類のビューが追加されました。これは、複数のリレーショナルテーブルに分かれて保存されているデータを、1つのJSONドキュメントとして扱えるようにする仕組みです。専用のCREATE JSON DUALITY VIEW / ALTER JSON DUALITY VIEWステートメントが追加されており、通常のビューと同様にDROP VIEWSHOW CREATE VIEWも利用できます。

JSON duality viewに関するメタデータを確認するために、Information Schemaには次のテーブルが追加されています。

  • JSON_DUALITY_VIEWS:ビューごとの情報
  • JSON_DUALITY_VIEW_COLUMNS:ビューに含まれる列
  • JSON_DUALITY_VIEW_LINKS:ビューと基盤テーブルの親子関係
  • JSON_DUALITY_VIEW_TABLES:ビューが参照するテーブル

アプリケーション側ではJSONドキュメントとしてSELECTしつつ、内部的には正規化されたテーブル構造を維持できるため、JSONベースのAPIとリレーショナルスキーマの橋渡しに使える機能です。なお、JSON duality viewに対する一部の高度な更新機能などはEnterprise Edition専用のため、今回は割愛します。

ETAG()関数による行ハッシュの生成

JSON duality viewの実装に関連して、行ごとのハッシュ値を生成するETAG()関数が追加されました。ETAG()は行の内容からハッシュを計算して返す関数で、たとえば次のような用途が考えられます。

  • 楽観的ロックのためのバージョン管理
  • JSONドキュメントとの整合性チェック
  • キャッシュ更新有無の判定

行の内容が変わればハッシュも変わるため、⁠前回取得した内容から変わっているか」を軽量に確認したい場面で便利です。

mysqlクライアントの--commandsオプション

mysqlコマンドラインクライアントに、新しいオプション--commandsが追加されました。これは\Tなどmysql独自のクライアントコマンドを一括で有効・無効にするもので、MySQL 9.4以降ではデフォルトが「無効」となっています。

クライアントコマンドを利用したい場合は、起動時に次のように指定します。

mysql --commands=ON -u root -p

セキュリティポリシー上、クライアントからファイル出力などを禁止したい場合に、設定ファイルや起動オプションから挙動を統一できる点がメリットです。

MySQL 9.5の新機能

つづいて、MySQL 9.5の新機能と変更点を紹介します。

innodb_log_writer_threadsのデフォルト挙動の変更

MySQL 9.5では、InnoDBのログ書き出しに関わるinnodb_log_writer_threadsのデフォルト値の決め方が変更されました。デフォルト値は、バイナリログの有無log_binと利用可能な論理CPU数によって自動的に決まります。

公式ドキュメントでは次のように説明されています。

  • log_bin = OFFの場合
    • 論理CPU数が4以下:innodb_log_writer_threads = OFF
    • 論理CPU数が5以上:innodb_log_writer_threads = ON
  • log_bin = ONの場合(従来どおり⁠
    • 論理CPU数が32未満:OFF
    • 論理CPU数が32以上:ON

明示的に設定している環境では影響ありませんが、未設定の場合、CPUコア数とバイナリログの設定に応じて、より妥当な並列ログ書き出しの設定が自動で選ばれるようになります。

binlog_transaction_dependency_history_sizeのデフォルト値と上限の拡大

レプリケーションの並列実行に関係するbinlog_transaction_dependency_history_sizeのデフォルト値が、25,000から1,000,000(100万)に引き上げられました。あわせて最大値も1,000,000(100万)から10,000,000(1,000万)に拡大されています。

この変数は、バイナリログに記録されたトランザクションの依存関係を解析する際に参照される履歴のサイズを表します。値が大きいほど、より多くのトランザクションについて依存関係を判断できるため、レプリカ側で同時に適用できるトランザクション数が増え、スループット向上が期待できます。

一方で、履歴を保持するために必要なメモリは増加するため、大きな値を設定する場合はメモリ使用量とのバランスを見ながら調整する必要があります。デフォルト値の引き上げは、特に大規模環境での並列レプリケーション性能を重視したチューニングだと言えるでしょう。

MySQL 9.5で削除されたレプリケーション関連変数

MySQL 9.5では、すでに非推奨となっていた一部のサーバー変数が削除されています。レプリケーションやGroup Replicationに関わる次の変数が対象です。

  • group_replication_allow_local_lower_version_join
  • replica_parallel_type

9.4とそれ以前の設定ファイルをそのまま 9.5で使おうとすると、これらの変数を指定している箇所でサーバー起動時にエラーとなる可能性があります。アップグレード前にmy.cnfを確認し、不要になった変数を削除しておくことをおすすめします。

まとめ

今回は MySQL 9.4と9.5の中から、MySQL Community Editionで利用できる新機能や変更点を中心に紹介しました。

  • 9.4では、JSON duality viewやETAG()関数の追加により、JSONベースのアプリケーションとリレーショナルスキーマの橋渡しがしやすくなりました。あわせて、mysqlクライアントの--commandsオプションやコンポーネントロード処理の改善など、運用まわりの細かな使い勝手も向上しています。

  • 9.5では、innodb_log_writer_threadsのデフォルト挙動の見直しやbinlog_transaction_dependency_history_sizeの拡大により、多コア環境・大規模レプリケーション構成でのスループット改善が期待できます。不要になったレプリケーション関連変数も整理されているため、アップグレード前の設定見直しが重要です。

詳しく知りたい場合は、公式マニュアルのWhat Is New in MySQL 9.4What Is New in MySQL 9.5もあわせて参照するとよいでしょう。

おすすめ記事

記事・ニュース一覧