完全な述語プッシュダウンは、範囲ベースのインデックススキャンの後に MySQL が SQL レイヤーで実行する冗長な行フィルタリングを排除し、PolarDB for MySQL での大規模な範囲クエリにおけるコンピューティングオーバーヘッドを削減します。
前提条件
開始する前に、以下を確認してください:
バージョン 8.0 を実行している PolarDB for MySQL クラスター
リビジョンバージョン 8.0.1.1.5 以降、または 8.0.2.2.0 以降
クラスターバージョンの確認方法については、「エンジンバージョンのクエリ」をご参照ください。
仕組み
MySQL Community Edition では、クエリが範囲条件を使用してインデックスをスキャンすると、その条件は 2 回評価されます:
完全な述語プッシュダウンがない場合:
ストレージエンジンは範囲条件を使用してインデックスをスキャンし、一致する行を返します。
SQL レイヤーは、同じ範囲条件を使用して返された行を再度フィルタリングします。
完全な述語プッシュダウンがある場合:
ストレージエンジンは範囲条件を使用してインデックスをスキャンし、一致する行を返します。
範囲条件は破棄されます。ストレージエンジンがすでに適用しているため、SQL レイヤーは再フィルタリングをスキップします。
この重複したフィルタリングは、コンピューティングリソースを浪費します。完全な述語プッシュダウンは、この冗長な SQL レイヤーのフィルターパスを削除します。
完全な述語プッシュダウンの有効化
loose_optimizer_switch パラメーターの detach_range_condition 変数を使用して、完全な述語プッシュダウンを有効化または無効化します。詳細については、「クラスターパラメーターとノードパラメーターの指定」をご参照ください。
EXPLAIN による検証
EXPLAIN の出力にある Extra フィールドを使用して、完全な述語プッシュダウンが有効かどうかを確認します:
Extra の値 | 意味 |
|---|---|
Using where | SQL レイヤーが行を再フィルタリングしています。完全な述語プッシュダウンは無効です。 |
Using index | SQL レイヤーは再フィルタリングをスキップします。完全な述語プッシュダウンは有効です。 |
無効 (ベースライン)
次の例では TPC-H スキーマを使用します。detach_range_condition を off に設定すると、EXPLAIN の出力に Using where が表示されます。これは、範囲条件が SQL レイヤーで再度適用されることを示しています (TPC-H Q2)。
set @@optimizer_switch='detach_range_condition=off';
EXPLAIN SELECT * FROM lineitem WHERE l_orderkey > 10 AND l_orderkey < 60000000 LIMIT 10000000, 10\G*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: lineitem
partitions: NULL
type: range
possible_keys: PRIMARY,i_l_orderkey,i_l_orderkey_quantity
key: PRIMARY
key_len: 4
ref: NULL
rows: 29720232
filtered: 100.00
Extra: Using where有効
ignore_polar_optimizer_rule を on に設定すると、ストレージエンジンのスキャン後に範囲条件が破棄されます。EXPLAIN の出力には Using index が表示され、SQL レイヤーが再フィルタリングをスキップすることを示します。次の例では、TPC-H Q5 と Q6 を使用します。
Q5
set @@ignore_polar_optimizer_rule=on;
EXPLAIN SELECT COUNT(*) FROM lineitem WHERE l_suppkey > 10 AND l_suppkey < 50000\G*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: lineitem
partitions: NULL
type: range
possible_keys: i_l_suppkey_partkey,i_l_suppkey
key: i_l_suppkey
key_len: 5
ref: NULL
rows: 29720232
filtered: 100.00
Extra: Using indexQ6
set @@ignore_polar_optimizer_rule=on;
EXPLAIN SELECT COUNT(*) FROM LINEITEM WHERE l_receiptDATE > '1992-01-03' AND l_receiptDATE < '1994-12-31'\G*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: LINEITEM
partitions: NULL
type: range
possible_keys: i_l_receiptdate
key: i_l_receiptdate
key_len: 4
ref: NULL
rows: 29720232
filtered: 100.00
Extra: Using indexテスト結果
次の図は、スケールファクター 10 の TPC-H クエリ Q5 と Q6 で測定した、完全な述語プッシュダウンを有効にした場合と無効にした場合のパフォーマンス差を示しています。
