MySQLのInnovation ReleaseとなるMySQL 9.
MySQL 9.0の新機能
ここでは、MySQL 9.
EXPLAIN ANALYZEのJSONフォーマット結果をユーザー変数へ格納可能に
EXPLAIN ANALYZEのJSONフォ−マット結果をユーザー変数に格納することができるようになりました。
EXPLAIN ANALYZEのJSONフォーマットを利用するには、システム変数explain_
を2に変更してから実行する必要があります。デフォルトは1になっています。
INTO句後に格納するユーザー変数を指定します。
mysql> SET SESSION explain_json_format_version=2; Query OK, 0 rows affected (0.00 sec) mysql> EXPLAIN ANALYZE FORMAT=JSON INTO @buf SELECT * FROM t1 WHERE col1=100; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @buf\G *************************** 1. row *************************** @buf: { "query": "/* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`col1` AS `col1`,`test`.`t1`.`col2` AS `col2`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`col1` = 100)", "covering": false, "operation": "Index lookup on t1 using col1 (col1 = 100)", "index_name": "col1", "query_type": "select", "table_name": "t1", "access_type": "index", "actual_rows": 0.0, "key_columns": [ "col1" ], "schema_name": "test", "actual_loops": 1, "used_columns": [ "id", "col1", "col2", "d" ], "estimated_rows": 1.0, "lookup_condition": "col1 = 100", "index_access_type": "index_lookup", "actual_last_row_ms": 0.019208999999999997, "actual_first_row_ms": 0.019208999999999997, "estimated_total_cost": 0.35 } 1 row in set (0.00 sec)
変数に格納することで、JSON関数を利用してEXPLAINの結果を操作することができるようになります。
mysql> SELECT JSON_EXTRACT(@buf, "$.access_type"); +-------------------------------------+ | JSON_EXTRACT(@buf, "$.access_type") | +-------------------------------------+ | "index" | +-------------------------------------+ 1 row in set (0.00 sec)
ちなみに、今回紹介したEXPLAIN ANALYSIS FORMAT=JSON INTO
はMySQL 9.EXPLAIN FORMAT=JSON INTO
はMySQL 8.
Performance Schemaのシステム変数テーブル
Performance Schemaに新たにvariables_
テーブルとglobal_
テーブルが追加されました。
variables_
テーブルはシステム変数の一般的な情報を表示します。max_
システム変数を例に見てみましょう。
mysql> SELECT * FROM variables_metadata WHERE VARIABLE_NAME = 'MAX_CONNECTIONS'\G *************************** 1. row *************************** VARIABLE_NAME: max_connections VARIABLE_SCOPE: GLOBAL DATA_TYPE: Integer MIN_VALUE: 1 MAX_VALUE: 100000 DOCUMENTATION: The number of simultaneous clients allowed 1 row in set (0.00 sec)
該当するシステム変数の取り得る最小値global_
テーブル、またはsession_
テーブルを利用します。
つづいて、global_
テーブルはMySQLサーバーによってグローバルスコープのシステム変数に割り当てられた属性と値のペアに関する情報を表示します。MySQLサーバー自体が管理し使用するテーブルのため、ユーザーが操作や閲覧することはありません。
LIMIT 1を使用した相関サブクエリの最適化
MySQL 8.subquery_
フラグが有効な場合、相関するスカラーサブクエリを派生テーブルに変換し、内部でLEFT JOINのクエリに書き換える最適化がサポートされました。この最適化では相関サブクエリにLIMIT 1が含まれている場合は最適化されない仕様になっていましたが、この変更により、LIMIT 1が含まれている場合でも最適化されるようになりました。
VECTOR型のサポート
VECTOR型がサポートされました。VECTORは、バイナリ文字列値またはリスト形式の文字列として表現できるエントリ
mysql> CREATE TABLE v (vcol VECTOR(3000));
あわせてSTRING_
やVECTOR_
など、VECTOR値を取り扱うSQL関数がサポートされました。詳しくは14.
MySQL 9.1の新機能
つづいて、MySQL 9.
読み取り専用操作においてのトリガーの最適化
以前のバージョンでは、トリガーをもつテーブルにアクセスするたびにトリガーを解析し、メモリにロードしていました。そのため、解析によるオーバヘッドや不必要なトリガーロードによるメモリの消費により、予想外のリソース消費や不要な実行時間が加わっていました。
MySQL9.
CREATE VIEW構文のIF NOT EXISTS句の対応
CREATE VIEW構文にIF NOT EXISTS句がサポートされました。IF NOT EXISTS
を指定すると、VIEWが存在しなければ作成されます。VIEWがすでに存在する場合は、エラーではなく警告を表示して成功します。
mysql> CREATE VIEW IF NOT EXISTS view1 AS SELECT col1,col2 FROM t1; Query OK, 0 rows affected, 1 warning (0.01 sec)
また、IF NOT EXISTS
はOR REPLACE
と一緒に使用できません。実行するとエラーになります。
mysql> CREATE OR REPLACE VIEW IF NOT EXISTS view1 AS SELECT col1,col2 FROM t1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS view1 AS SELECT col1,col2 FROM t1' at line 1
データベースに関するDDLのクラッシュセーフ
MySQL 8.
MySQL 9.CREATE DATABASE
とInnoDBのようなアトミックDDLをサポートするストレージエンジンのテーブルで構成されているデータベースに対するDROP DATABASE
が、アトミックでクラッシュセーフになりました。
まとめ
今回はMySQL 9.