重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

最適化ルールと式のプッシュダウンのブロックリスト

このドキュメントでは、最適化ルールのブロックリストと式プッシュダウンのブロックリストを使用して、TiDBの動作を制御する方法を紹介します。

最適化ルールのブロックリスト

最適化ルールのブロックリストは、最適化ルールを調整する1つの方法であり、主に一部の最適化ルールを手動で無効にするために使用されます。

重要な最適化ルール

最適化ルールルール名説明
カラムの剪定column_prune上位のエグゼキュータが必要としない場合、1人のオペレータが列を削除します。
サブクエリを非相関化デコレレート相関サブクエリを非相関結合または集約に書き直そうとします。
集計除去Aggregation_eliminate実行プランから不要な集計演算子を削除しようとします。
突起物の除去Projection_eliminate実行プランから不要な射影演算子を削除します。
最大/最小除去max_min_eliminate一部のmax/min関数を集約してorder by + limit 1形式に書き換えます。
述語プッシュダウンpredicate_push_downデータソースに近い演算子に述語をプッシュしようとします。
アウタージョイン除去アウタージョインエリミネート実行プランから不要な左結合または右結合を削除しようとします。
パーティションの剪定partition_processor述部によって拒否されたパーティションを削除し、パーティションテーブルクエリをUnionAll + Partition Datasource形式に書き換えます。
集計プッシュダウンAggregation_push_downアグリゲーションを子にプッシュしようとします。
TopNプッシュダウンtopn_push_downTopN演算子をデータソースに近い場所にプッシュしようとします。
再注文に参加するjoin_reorderマルチテーブル結合の順序を決定します。

最適化ルールを無効にする

一部のルールが特別なクエリの最適ではない実行プランにつながる場合は、最適化ルールのブロックリストを使用して、それらの一部を無効にすることができます。

使用法

ノート:

以下のすべての操作には、データベースのsuper privilegeの特権が必要です。各最適化ルールには名前があります。たとえば、列プルーニングの名前はcolumn_pruneです。すべての最適化ルールの名前は、表重要な最適化ルールの2番目の列にあります。

  • 一部のルールを無効にする場合は、その名前をmysql.opt_rule_blacklistテーブルに書き込みます。例えば:

    INSERT INTO mysql.opt_rule_blacklist VALUES("join_reorder"), ("topn_push_down");
    

    次のSQLステートメントを実行すると、上記の操作をすぐに有効にすることができます。有効範囲には、対応するTiDBサーバーのすべての古い接続が含まれます。

    admin reload opt_rule_blacklist;
    

    ノート:

    admin reload opt_rule_blacklistは、上記のステートメントが実行されたTiDBサーバーでのみ有効です。クラスタのすべてのTiDBサーバーを有効にする場合は、各TiDBサーバーでこのコマンドを実行します。

  • ルールを再度有効にする場合は、テーブル内の対応するデータを削除してから、次のadmin reloadのステートメントを実行します。

    DELETE FROM mysql.opt_rule_blacklist WHERE name IN ("join_reorder", "topn_push_down");
    
    admin reload opt_rule_blacklist;
    

式プッシュダウンのブロックリスト

式のプッシュダウンのブロックリストは、式のプッシュダウンを調整する1つの方法であり、主に特定のデータ型の一部の式を手動で無効にするために使用されます。

プッシュダウンがサポートされている式

式の分類具体的な操作
論理演算AND(&&)、OR(
比較関数と演算子<<=、=、!=( <> )、>> =、 &#x3C;=> 、IS NULL、LIKE、IS TRUE、IS COALESCE()IN()
数値関数と演算子FLOOR() 、-、 CEIL()CEILING()ABS()
制御フロー関数CASE IF() IFNULL()
JSON関数JSON_TYPE(json_val)
JSON_EXTRACT(json_doc、path [、path] ...)
JSON_UNQUOTE(json_val)
JSON_OBJECT(key、val [、key、val] ...)
JSON_ARRAY([val [、val] ...])
JSON_MERGE(json_doc、json_doc [、json_doc] ...)
JSON_SET(json_doc、path、val [、path、val] ...)
JSON_INSERT(json_doc、path、val [、path、val] ...)
JSON_REPLACE(json_doc、path、val [、path、val] ...)
JSON_REMOVE(json_doc、path [、path] ...)
日付と時刻の関数DATE_FORMAT()

特定の式のプッシュダウンを無効にする

式のプッシュダウンが原因で間違った結果が得られた場合は、ブロックリストを使用してアプリケーションをすばやく回復できます。具体的には、サポートされている関数または演算子の一部をmysql.expr_pushdown_blacklistテーブルに追加して、特定の式のプッシュダウンを無効にすることができます。

mysql.expr_pushdown_blacklistのスキーマは次のように表示されます。

DESC mysql.expr_pushdown_blacklist;
+------------+--------------+------+------+-------------------+-------+
| Field      | Type         | Null | Key  | Default           | Extra |
+------------+--------------+------+------+-------------------+-------+
| name       | char(100)    | NO   |      | NULL              |       |
| store_type | char(100)    | NO   |      | tikv,tiflash,tidb |       |
| reason     | varchar(200) | YES  |      | NULL              |       |
+------------+--------------+------+------+-------------------+-------+
3 rows in set (0.00 sec)

上記の各フィールドの説明は次のとおりです。

  • name :プッシュダウンが無効になっている関数の名前。
  • store_type :計算のために関数がプッシュダウンされないようにするコンポーネントを指定します。使用可能なコンポーネントは、 tidb 、およびtikv tiflashstore_typeでは大文字と小文字は区別されません。複数のコンポーネントを指定する必要がある場合は、コンマを使用して各コンポーネントを区切ります。
    • store_typetidbの場合、TiDBメモリテーブルの読み込み中に他のTiDBサーバーで機能を実行できるかどうかを示します。
    • store_typetikvの場合、TiKVサーバーのコプロセッサーコンポーネントで機能を実行できるかどうかを示します。
    • store_typetiflashの場合、TiFlashサーバーのコプロセッサーコンポーネントで機能を実行できるかどうかを示します。
  • reason :この機能がブロックリストに追加された理由を記録します。

使用法

このセクションでは、式プッシュダウンのブロックリストを使用する方法について説明します。

ブロックリストに追加

1つ以上の式(関数または演算子)をブロックリストに追加するには、次の手順を実行します。

  1. 対応する関数名または演算子名、およびプッシュダウンを無効にするコンポーネントのセットをmysql.expr_pushdown_blacklistのテーブルに挿入します。

  2. admin reload expr_pushdown_blacklistを実行します。

ブロックリストから削除する

ブロックリストから1つ以上の式を削除するには、次の手順を実行します。

  1. 対応する関数名または演算子名、およびプッシュダウンを無効にするコンポーネントのセットをmysql.expr_pushdown_blacklistのテーブルから削除します。

  2. admin reload expr_pushdown_blacklistを実行します。

ノート:

admin reload expr_pushdown_blacklistは、このステートメントが実行されるTiDBサーバーでのみ有効です。クラスタのすべてのTiDBサーバーを有効にする場合は、各TiDBサーバーでこのコマンドを実行します。

式ブロックリストの使用例

次の例では、 <>の演算子がブロックリストに追加され、次に>の演算子がブロックリストから削除されます。

ブロックリストが有効かどうかを判断するには、 EXPLAINの結果を観察します( TiDBクエリ実行プランの概要を参照)。

  1. 次のSQLステートメントのWHERE節の述語a < 2a > 2は、TiKVにプッシュダウンできます。

    EXPLAIN SELECT * FROM t WHERE a < 2 AND a > 2;
    
    +-------------------------+----------+-----------+---------------+------------------------------------+
    | id                      | estRows  | task      | access object | operator info                      |
    +-------------------------+----------+-----------+---------------+------------------------------------+
    | TableReader_7           | 0.00     | root      |               | data:Selection_6                   |
    | └─Selection_6           | 0.00     | cop[tikv] |               | gt(ssb_1.t.a, 2), lt(ssb_1.t.a, 2) |
    |   └─TableFullScan_5     | 10000.00 | cop[tikv] | table:t       | keep order:false, stats:pseudo     |
    +-------------------------+----------+-----------+---------------+------------------------------------+
    3 rows in set (0.00 sec)
    
  2. 式をmysql.expr_pushdown_blacklistテーブルに挿入し、 admin reload expr_pushdown_blacklistを実行します。

    INSERT INTO mysql.expr_pushdown_blacklist VALUES('<','tikv',''), ('>','tikv','');
    
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    admin reload expr_pushdown_blacklist;
    
    Query OK, 0 rows affected (0.00 sec)
    
  3. 実行プランをもう一度観察すると、 <演算子と>演算子の両方がTiKVコプロセッサーにプッシュダウンされていないことがわかります。

    EXPLAIN SELECT * FROM t WHERE a < 2 and a > 2;
    
    +-------------------------+----------+-----------+---------------+------------------------------------+
    | id                      | estRows  | task      | access object | operator info                      |
    +-------------------------+----------+-----------+---------------+------------------------------------+
    | Selection_7             | 10000.00 | root      |               | gt(ssb_1.t.a, 2), lt(ssb_1.t.a, 2) |
    | └─TableReader_6         | 10000.00 | root      |               | data:TableFullScan_5               |
    |   └─TableFullScan_5     | 10000.00 | cop[tikv] | table:t       | keep order:false, stats:pseudo     |
    +-------------------------+----------+-----------+---------------+------------------------------------+
    3 rows in set (0.00 sec)
    
  4. ブロックリストから1つの式(ここでは> )を削除し、 admin reload expr_pushdown_blacklistを実行します。

    DELETE FROM mysql.expr_pushdown_blacklist WHERE name = '>';
    
    Query OK, 1 row affected (0.01 sec)
    
    admin reload expr_pushdown_blacklist;
    
    Query OK, 0 rows affected (0.00 sec)
    
  5. 実行プランをもう一度観察すると、 >がTiKVコプロセッサーにプッシュダウンされている間、 <はプッシュダウンされていないことがわかります。

    EXPLAIN SELECT * FROM t WHERE a < 2 AND a > 2;
    
    +---------------------------+----------+-----------+---------------+--------------------------------+
    | id                        | estRows  | task      | access object | operator info                  |
    +---------------------------+----------+-----------+---------------+--------------------------------+
    | Selection_8               | 0.00     | root      |               | lt(ssb_1.t.a, 2)               |
    | └─TableReader_7           | 0.00     | root      |               | data:Selection_6               |
    |   └─Selection_6           | 0.00     | cop[tikv] |               | gt(ssb_1.t.a, 2)               |
    |     └─TableFullScan_5     | 10000.00 | cop[tikv] | table:t       | keep order:false, stats:pseudo |
    +---------------------------+----------+-----------+---------------+--------------------------------+
    4 rows in set (0.00 sec)