すべてのプロダクト
Search
ドキュメントセンター

PolarDB:完全な述語プッシュダウン

最終更新日:Mar 29, 2026

完全な述語プッシュダウンは、範囲ベースのインデックススキャンの後に MySQL が SQL レイヤーで実行する冗長な行フィルタリングを排除し、PolarDB for MySQL での大規模な範囲クエリにおけるコンピューティングオーバーヘッドを削減します。

前提条件

開始する前に、以下を確認してください:

  • バージョン 8.0 を実行している PolarDB for MySQL クラスター

  • リビジョンバージョン 8.0.1.1.5 以降、または 8.0.2.2.0 以降

クラスターバージョンの確認方法については、「エンジンバージョンのクエリ」をご参照ください。

仕組み

MySQL Community Edition では、クエリが範囲条件を使用してインデックスをスキャンすると、その条件は 2 回評価されます:

完全な述語プッシュダウンがない場合:

  1. ストレージエンジンは範囲条件を使用してインデックスをスキャンし、一致する行を返します。

  2. SQL レイヤーは、同じ範囲条件を使用して返された行を再度フィルタリングします。

完全な述語プッシュダウンがある場合:

  1. ストレージエンジンは範囲条件を使用してインデックスをスキャンし、一致する行を返します。

  2. 範囲条件は破棄されます。ストレージエンジンがすでに適用しているため、SQL レイヤーは再フィルタリングをスキップします。

この重複したフィルタリングは、コンピューティングリソースを浪費します。完全な述語プッシュダウンは、この冗長な SQL レイヤーのフィルターパスを削除します。

完全な述語プッシュダウンの有効化

loose_optimizer_switch パラメーターの detach_range_condition 変数を使用して、完全な述語プッシュダウンを有効化または無効化します。詳細については、「クラスターパラメーターとノードパラメーターの指定」をご参照ください。

EXPLAIN による検証

EXPLAIN の出力にある Extra フィールドを使用して、完全な述語プッシュダウンが有効かどうかを確認します:

Extra の値意味
Using whereSQL レイヤーが行を再フィルタリングしています。完全な述語プッシュダウンは無効です。
Using indexSQL レイヤーは再フィルタリングをスキップします。完全な述語プッシュダウンは有効です。

無効 (ベースライン)

次の例では TPC-H スキーマを使用します。detach_range_conditionoff に設定すると、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_ruleon に設定すると、ストレージエンジンのスキャン後に範囲条件が破棄されます。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 index

Q6

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 で測定した、完全な述語プッシュダウンを有効にした場合と無効にした場合のパフォーマンス差を示しています。

谓词下推
実際のパフォーマンス向上は、ワークロード、データ分散、およびクラスター構成によって異なります。ご自身の環境で影響を評価するために、独自のベンチマークを実行してください。