MySQL道普請便り

第245回MySQL 9.2と9.3の新機能について

MySQLのInnovation ReleaseとなるMySQL 9.2が2025年1月、MySQL 9.3が2025年4月にリリースされました。以前の記事の第233回 MySQL 9.0と9.1の新機能についてと同じように、今回もMySQL 9.2と9.3の中から気になる新機能や変更点を、いくつかピックアップして簡単に紹介したいと思います。

MySQL 9.2の新機能

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

CREATE_SPATIAL_REFERENCE_SYSTEM権限の追加

GIS管理のために追加された新しい動的権限です。この権限を持つユーザーは以下のステートメントを実行できます。

  • CREATE SPATIAL REFERENCE SYSTEM
  • CREATE OR REPLACE SPATIAL REFERENCE SYSTEM
  • DROP SPATIAL REFERENCE SYSTEM

SUPER権限を持つユーザーもこれらのステートメントを実行できますが、SUPER権限は非推奨となっているため、適切な権限設定をするのが望ましいでしょう。

EXPLAIN FORMAT=JSON フォーマットバージョン情報の追加

explain_json_format_version=2に設定されている場合、EXPLAIN FORMAT=JSONの出力にフォーマットバージョン情報が追加されます。explain_json_format_versionオプションは、EXPLAIN FORMAT=JSONステートメントで使用されるJSON出力形式のバージョンを指定します。取り得る値は1または2です。1はMySQLの以前のバージョンのスタイルで、2はアクセスパスに基づいており、MySQL Optimizerの将来のバージョンとの互換性を高めることを目的としています。

explain_json_format_versionが1と2の場合のEXPLAIN FORMAT=JSONの出力を比較してみます。

explain_json_format_version=1の場合
mysql> SET @@explain_json_format_version = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> EXPLAIN FORMAT=JSON SELECT 1\G
*************************** 1. row ***************************
EXPLAIN: {
  "query_block": {
    "select_id": 1,
    "message": "No tables used"
  }
}
1 row in set, 1 warning (0.00 sec)
explain_json_format_version=2の場合
mysql> SET @@explain_json_format_version = 2;
Query OK, 0 rows affected (0.00 sec)

mysql> EXPLAIN FORMAT=JSON SELECT 1\G
*************************** 1. row ***************************
EXPLAIN: {
  "query": "/* select#1 */ select 1 AS `1`",
  "query_plan": {
    "operation": "Rows fetched before execution",
    "access_type": "rows_fetched_before_execution",
    "estimated_rows": 1.0,
    "estimated_total_cost": 0.0,
    "estimated_first_row_cost": 0.0
  },
  "query_type": "select",
  "json_schema_version": "2.0"
}
1 row in set (0.00 sec)

FLUSH PRIVILEGESステートメントの非推奨化

FLUSH PRIVILEGESステートメントは MySQL 9.2で非推奨となり、実行すると警告が表示されるようになりました。

FLUSH PRIVILEGESステートメントは mysqlシステムスキーマの権限テーブルから権限を再読み取りします。ユーザーテーブルなどを直接更新し、権限とユーザーの更新を有効にするために使用されていました。しかし、直接ユーザーテーブルを更新することは推奨されていないため、FLUSH PRIVILEGESは非推奨になりました。ユーザー情報を変更する際は、CREATE USER、GRANT、REVOKEステートメントを利用してください。これらのステートメントは即時に有効になり、権限テーブルから権限を再読み取りは必要ありません。

BINLOGキーワードの制限追加

BINLOGキーワードが制限され、MySQLストアドプログラムのラベルとして引用符なしで使用できなくなりました。MySQL 9.2にアップグレードする前に、影響を受けるアプリケーションを更新する必要があります。

MySQL 9.3の新機能

つづいて、MySQL9.3の新機能と変更点について紹介します。

mysqldumpによるユーザーアカウントの論理ダンプ

これまでは、ユーザーアカウントのみをダンプするにはpt-show-grantsを利用することが多かったと思います。pt-show-grantsについては以前の記事 第160回 pt-show-grantsを使ってユーザアカウントを移行する をご参照ください。

MySQL 9.3のmysqldumpでは、ユーザーアカウントの論理ダンプが可能になりました。--usersオプションを使うことで、指定したユーザーアカウントの情報をCREATE USERGRANTステートメントの形式でダンプできます。

オプションも複数あり、--add-drop-userオプションを使用すると、CREATE USERステートメントの前にDROP USERを追加できます。--usersオプションだけを使用すると、すべてのユーザーアカウントの情報がダンプに含まれますが、以下の追加オプションで選択的にダンプすることも可能です。

  • --include-user=user@host:特定のユーザーアカウント情報のみを含める。複数のアカウントを含める場合は、このオプションを複数回使用します。
  • --exclude-user=user@host:特定のユーザーアカウント情報を除外する。複数のアカウントを除外する場合は、このオプションを複数回使用します。

ユーザーアカウントのバックアップやデータベース移行時には、こちらを利用するとよいでしょう。

ANYおよびALLサブクエリの最適化

optimizer_switch変数のsubquery_to_derivedフラグが有効な場合、ANYおよびALLサブクエリの最適化が強化されました。これにより、サブクエリを使用するクエリのパフォーマンスが向上します。具体的には、ANYおよびALLを使用したサブクエリを、派生テーブルを使った結合に変換することで、クエリの実行が効率的になります。サポートされる比較演算子には、=ANY、<>ALL、>ANY、>=ANY、<ANY、<=ANY、>ALL、>=ALL、<ALL、<=ALLが含まれます。

まとめ

今回はMySQL 9.2とMySQL 9.3のいくつかの新機能や変更点について紹介しました。MySQL 9.2と9.3では目立った大きな新機能はない印象です。

ただ、この記事はMySQL Community Editionにフォーカスしているため説明から省きましたが、MySQL 9.2と9.3では商用版のMySQL Enterprise Editionのみで利用できる新機能や修正が多く含まれています。

以下ドキュメントを参考にしました。詳しく知りたい方はご参照ください。

おすすめ記事

記事・ニュース一覧