この最適化は、インデックスが設定されていないカラムと定数の直接比較の効率を向上させます。このような場合、条件は評価のためにストレージエンジンに
「プッシュダウン」 されます。MySQL
5.1 では、この最適化は
NDBCLUSTER
ストレージエンジンでのみ使用できますが、MySQL
の今後のバージョンでほかのストレージエンジン向けにも実装する予定です。
MySQL Cluster では、この最適化により、一致しない行をクラスタのデータノードとクエリーを発行した MySQL サーバーの間でネットワーク経由で送る必要がなくなり、コンディションプッシュダウンを使用できる状態にあるが使用してない場合に比べて、クエリーの速度が 5 - 10 倍に向上します。
MySQL Cluster テーブルが次のように定義されていると仮定します。
CREATE TABLE t1 ( a INT, b INT, KEY(a) ) ENGINE=NDBCLUSTER;
コンディションプッシュダウンは、このテーブルに対する次のようなクエリーで使用できます。
SELECT a,b FROM t1 WHERE b = 10;
これは
EXPLAIN
SELECT
の出力で見られます。
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;
この 2
つのクエリーのうち最初のものに関しては、インデックスが
a
カラムに存在するため、コンディションプッシュダウンは適用できません。(インデックスアクセスメソッドの方が効率的なので、コンディションプッシュダウンよりも優先して選択されます。)
2
番目のクエリーの場合、インデックスが設定されていないカラム
b
に関する比較は直接的でないため、コンディションプッシュダウンが適用できません。(ただし、b
+ 1 = 10
を WHERE
節内で 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] LIKE pattern
pattern
は、照合するパターンを含んだ文字列リテラルでなければいけません。構文については、項7.4.1. 「文字列比較関数」を参照してください。
column
IS [NOT] NULL
column
IN (value_list
)
value_list
の各項目は定数リテラル値でなければいけません。
column
BETWEEN constant1
AND
constant2
constant1
と
constant2
はそれぞれ、定数リテラル値でなければいけません。
上記のどの場合の条件も、カラムと定数の直接比較を 1 つ以上使用した形式に変換できます。
コンディションプッシュダウン機能はデフォルトでは使用されません。有効にするには、mysqld
を --engine-condition-pushdown
オプションで起動するか、実行時に次のステートメントのいずれかを実行します。
SET engine_condition_pushdown=ON;
SET engine_condition_pushdown=1;
制限. コンディションプッシュダウンには次の制限があります。
MySQL 5.1
では、コンディションプッシュダウンは
NDBCLUSTER
ストレージエンジンでのみサポートされています。
カラムは定数とだけ比較できます。これには、評価結果が定数値になる式も含まれます。
BLOB
型や
TEXT
型のカラムは比較に使用できません。
カラムと比較する文字列値には、カラムと同じ照合を使用する必要があります。
結合は直接にはサポートされていません。複数のテーブルを使用する条件は、可能な場合は個別にプッシュされます。どの条件が実際にプッシュダウンされるかを調べるには、EXPLAIN
EXTENDED
を使用します。