MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

8.3.11 生成されたカラムインデックスのオプティマイザによる使用

MySQL では、生成されたカラムのインデックスがサポートされます。 例:

CREATE TABLE t1 (f1 INT, gc INT AS (f1 + 1) STORED, INDEX (gc));

生成されたカラム gc は、式 f1 + 1 として定義されます。 カラムもインデックス付けされ、オプティマイザは実行計画の構成時にそのインデックスを考慮できます。 次のクエリーでは、WHERE 句が gc を参照し、オプティマイザはそのカラムのインデックスがより効率的な計画をもたらすかどうかを考慮します:

SELECT * FROM t1 WHERE gc > 9;

オプティマイザは、生成されたカラムのインデックスを使用して実行計画を生成できます。これらのカラムへの名前によるクエリーに直接参照がない場合でも同様です。 これは、WHEREORDER BY または GROUP BY 句が、インデックス付けされた生成カラムの定義と一致する式を参照している場合に発生します。 次のクエリーは、gc を直接参照しませんが、gc の定義と一致する式を使用します:

SELECT * FROM t1 WHERE f1 + 1 > 9;

オプティマイザは、式 f1 + 1gc の定義と一致し、gc がインデックス付けされていることを認識するため、実行計画の構成時にそのインデックスが考慮されます。 これは、EXPLAIN を使用して表示できます:

mysql> EXPLAIN SELECT * FROM t1 WHERE f1 + 1 > 9\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: range
possible_keys: gc
          key: gc
      key_len: 5
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using index condition

実際には、オプティマイザは式 f1 + 1 を、式に一致する生成されたカラムの名前に置き換えています。 これは、SHOW WARNINGS によって表示される拡張 EXPLAIN 情報で使用可能なリライトされたクエリーでもわかります:

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select `test`.`t1`.`f1` AS `f1`,`test`.`t1`.`gc`
         AS `gc` from `test`.`t1` where (`test`.`t1`.`gc` > 9)

生成されたカラムインデックスのオプティマイザでの使用には、次の制限および条件が適用されます: