この最適化は、インデックスが設定されていないカラムと定数との直接比較の効率性を向上します。このような場合、条件が評価のためにストレージエンジンに「プッシュダウン」されます。この最適化は、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 = 10
を b = 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] LIKEpattern
pattern
は、照合するパターンを含む文字列リテラルである必要があります。構文については、セクション12.5.1「文字列比較関数」を参照してください。 column
IS [NOT] NULL-
column
IN (value_list
)value_list
の各項目は定数のリテラル値である必要があります。 -
column
BETWEENconstant1
ANDconstant2
constant1
とconstant2
はそれぞれ、定数のリテラル値である必要があります。
前のリストのすべての場合で、条件をカラムと定数との 1 つ以上の直接比較の形式に変換できます。
エンジンコンディションプッシュダウンはデフォルトで有効です。サーバーの起動時にそれを無効にするには、optimizer_switch
システム変数を設定します。たとえば、my.cnf
ファイルで、次の行を使用します。
[mysqld]
optimizer_switch=engine_condition_pushdown=off
実行時に、次のようにコンディションプッシュダウンを有効にします。
SET optimizer_switch='engine_condition_pushdown=off';
制限 エンジンコンディションプッシュダウンには次の制限があります。
コンディションプッシュダウンは、
NDB
ストレージエンジンによってのみサポートされます。カラムは定数とのみ比較できますが、これには、定数値に評価される式も含まれます。
比較に使用されるカラムは、
BLOB
型またはTEXT
型のいずれかであってはいけません。カラムと比較される文字列値は、カラムと同じ照合順序を使用する必要があります。
結合は直接サポートされていません。複数のテーブルを含む条件は、可能な場合に個別にプッシュされます。実際にプッシュダウンされる条件を判断するには、
EXPLAIN EXTENDED
を使用します。