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

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

8.2.1.14 定数 - フォールディングの最適化

定数値が範囲外であるか、カラムタイプに関して間違ったタイプである定数とカラム値の比較は、クエリーの最適化中に、実行中ではなく行単位で処理されるようになりました。 この方法で処理できる比較は、>, >=, <, <=, <>/!== および <=> です。

次のステートメントで作成されたテーブルについて考えてみます:

CREATE TABLE t (c TINYINT UNSIGNED NOT NULL);

クエリー SELECT * FROM t WHERE c < 256WHERE 条件に、TINYINT UNSIGNED カラムの範囲外の整数定数 256 が含まれています。 これまでは、両方のオペランドを大きい型として扱うことで処理されていましたが、c に許可されている値が定数より小さいため、かわりに WHERE 式を WHERE 1 として折りたたんで、クエリーを SELECT * FROM t WHERE 1 としてリライトできます。

これにより、オプティマイザは WHERE 式を完全に削除できます。 カラム c が NULL 値可能だった (つまり、TINYINT UNSIGNED としてのみ定義されていた) 場合、クエリーは次のようにリライトされます:

SELECT * FROM t WHERE ti IS NOT NULL

折りたたみは、サポートされている MySQL カラムタイプと比較して、次のように定数に対して実行されます:

制限.  この最適化は、次の場合には使用できません:

  1. BETWEEN または IN を使用した比較。

  2. 日付型または時間型を使用する BIT のカラムまたはカラム。

  3. プリペアドステートメントの準備フェーズ中。ただし、プリペアドステートメントが実際に実行されるときに最適化フェーズ中に適用できます。 これは、ステートメントの準備中に定数の値が不明であるためです。