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が含まれている場合でも最適化されるようになりました。
mysql> explain SELECT id, (SELECT id FROM t1 t WHERE t.col1=t1.col1 LIMIT 1) FROM t1 LIMIT 10; +----+--------------------+-------+------------+-------+---------------+------+---------+--------------+--------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+--------------------+-------+------------+-------+---------------+------+---------+--------------+--------+----------+-------------+ | 1 | PRIMARY | t1 | NULL | index | NULL | col1 | 5 | NULL | 131035 | 100.00 | Using index | | 2 | DEPENDENT SUBQUERY | t | NULL | ref | col1 | col1 | 5 | test.t1.col1 | 1 | 100.00 | Using index | +----+--------------------+-------+------------+-------+---------------+------+---------+--------------+--------+----------+-------------+ 2 rows in set, 2 warnings (0.00 sec)
mysql> explain SELECT id, (SELECT id FROM t1 t WHERE t.col1=t1.col1 LIMIT 1) FROM t1 LIMIT 10; +----+-------------+------------+------------+-------+---------------+-------------+---------+--------------+--------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+-------+---------------+-------------+---------+--------------+--------+----------+-------------+ | 1 | PRIMARY | t1 | NULL | index | NULL | col1 | 5 | NULL | 131035 | 100.00 | Using index | | 1 | PRIMARY | <derived2> | NULL | ref | <auto_key0> | <auto_key0> | 5 | test.t1.col1 | 10 | 100.00 | NULL | | 2 | DERIVED | t | NULL | index | col1 | col1 | 5 | NULL | 131035 | 100.00 | Using index | +----+-------------+------------+------------+-------+---------------+-------------+---------+--------------+--------+----------+-------------+ 3 rows in set, 2 warnings (0.01 sec)
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.