Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  エンジンコンディションプッシュダウンの最適化

8.2.1.5 エンジンコンディションプッシュダウンの最適化

この最適化は、インデックスが設定されていないカラムと定数との直接比較の効率性を向上します。このような場合、条件が評価のためにストレージエンジンにプッシュダウンされます。この最適化は、NDB ストレージエンジンでのみ使用できます。

MySQL Cluster では、この最適化によって、クラスタのデータノードとクエリーを発行した MySQL Server 間で、ネットワーク経由で一致しない行を送る必要性をなくすことができ、それを使用した場合のクエリーを、コンディションプッシュダウンが可能であっても使用しない場合より、5 - 10 倍高速化できます。

MySQL Cluster テーブルが次のように定義されているとします。

CREATE TABLE t1 (
    a INT,
    b INT,
    KEY(a)
) ENGINE=NDB;

コンディションプッシュダウンは、インデックスが設定されていないカラムと定数との比較を含む、ここに示すようなクエリーで使用できます。

SELECT a, b FROM t1 WHERE b = 10;

コンディションプッシュダウンの使用は、EXPLAIN の出力で確認できます。

mysql> EXPLAIN SELECT a,b FROM t1 WHERE b = 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 10
        Extra: Using where with pushed condition

ただし、コンディションプッシュダウンは、これらの 2 つのクエリーのいずれかと一緒に使用することはできません

SELECT a,b FROM t1 WHERE a = 10;
SELECT a,b FROM t1 WHERE b + 1 = 10;

カラム a にインデックスが存在するため、コンディションプッシュダウンは最初のクエリーには適用できません。(インデックスアクセスメソッドの方が効率的であるため、コンディションプッシュダウンよりも優先して選択されます。) インデックスが設定されていないカラム b を含む比較は間接的であるため、2 つめのクエリーにコンディションプッシュダウンを採用することはできません。(ただし、WHERE 句内で b + 1 = 10b = 9 にまとめる場合はコンディションプッシュダウンを適用できます。)

> または < 演算子を使用して、インデックス設定されたカラムを定数と比較する場合にもコンディションプッシュダウンを採用できます。

mysql> EXPLAIN SELECT a, b FROM t1 WHERE a < 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
         type: range
possible_keys: a
          key: a
      key_len: 5
          ref: NULL
         rows: 2
        Extra: Using where with pushed condition

コンディションプッシュダウンでサポートされるその他の比較には、次が含まれます。

  • column [NOT] LIKE pattern

    pattern は、照合するパターンを含む文字列リテラルである必要があります。構文については、セクション12.5.1「文字列比較関数」を参照してください。

  • column IS [NOT] NULL

  • column IN (value_list)

    value_list の各項目は定数のリテラル値である必要があります。

  • column BETWEEN constant1 AND constant2

    constant1constant2 はそれぞれ、定数のリテラル値である必要があります。

前のリストのすべての場合で、条件をカラムと定数との 1 つ以上の直接比較の形式に変換できます。

エンジンコンディションプッシュダウンはデフォルトで有効です。サーバーの起動時にそれを無効にするには、optimizer_switch システム変数を設定します。たとえば、my.cnf ファイルで、次の行を使用します。

[mysqld]
optimizer_switch=engine_condition_pushdown=off

実行時に、次のようにコンディションプッシュダウンを有効にします。

SET optimizer_switch='engine_condition_pushdown=off';

制限  エンジンコンディションプッシュダウンには次の制限があります。

  • コンディションプッシュダウンは、NDB ストレージエンジンによってのみサポートされます。

  • カラムは定数とのみ比較できますが、これには、定数値に評価される式も含まれます。

  • 比較に使用されるカラムは、BLOB 型または TEXT 型のいずれかであってはいけません。

  • カラムと比較される文字列値は、カラムと同じ照合順序を使用する必要があります。

  • 結合は直接サポートされていません。複数のテーブルを含む条件は、可能な場合に個別にプッシュされます。実際にプッシュダウンされる条件を判断するには、EXPLAIN EXTENDED を使用します。


User Comments
Sign Up Login You must be logged in to post a comment.