プッシュダウンの式一覧

TiDB は TiKV からデータを読み取るときに、TiKV に処理されるいくつかの式 (関数または演算子の計算を含む) をプッシュダウンしようとします。これにより、転送されるデータの量が削減され、単一の TiDB ノードからの処理がオフロードされます。このドキュメントでは、TiDB が既にプッシュ ダウンをサポートしている式と、ブロックリストを使用して特定の式のプッシュ ダウンを禁止する方法を紹介します。

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

式タイプオペレーション
論理演算子AND (&&)、OR (
比較関数と演算子<<=、=、!= ( <> )、>>=、 &#x3C;=> 、IS NULL、LIKE、IS TRUE、IS COALESCE()IN()
数値関数と演算子+, -, *, /, ABS() , CEIL() , CEILING() , FLOOR() , MOD()
制御フロー関数CASEIF()IFNULL()
JSON関数JSON_TYPE(json_val)
JSON_EXTRACT(json_doc, path[, path] ...)
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()SYSDATE()
文字列関数RIGHT()

ブロックリスト固有の式

サポートされている式または特定のデータ型 ( ENUMBITタイプのみ) をプッシュダウンしたときに計算プロセスで予期しない動作が発生した場合は、対応する関数、演算子、またはデータ型のプッシュダウンを禁止することで、アプリケーションを迅速に復元できます。具体的には、関数、演算子、またはデータ型をブロックリストに追加することで、プッシュ ダウンを禁止できますmysql.expr_pushdown_blacklist 。詳細はブロックリストに追加を参照してください。

mysql.expr_pushdown_blacklistのスキーマは次のとおりです。

tidb> 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 はtikvtidb 、およびtiflashの 3 つのストレージ エンジンをサポートしています。 store_typeは大文字と小文字を区別しません。関数が複数のストレージ エンジンにプッシュされることが禁止されている場合は、コンマを使用して各エンジンを区切ります。
  • reason : 関数がブロックリストに登録された理由。

ブロックリストに追加

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

  1. 以下をmysql.expr_pushdown_blacklistに挿入します。

    • プッシュダウンを禁止する関数、演算子、またはデータ型の名前
    • プッシュダウンを禁止するストレージエンジン
  2. admin reload expr_pushdown_blacklist;コマンドを実行します。

ブロックリストから削除

ブロックリストから 1 つ以上の関数、演算子、またはデータ型を削除するには、次の手順を実行します。

  1. mysql.expr_pushdown_blacklistの関数、演算子、またはデータ型の名前を削除します。

  2. admin reload expr_pushdown_blacklist;コマンドを実行します。

ブロックリストの使用例

次の例は、 DATE_FORMAT()関数、 >演算子、およびBITデータ型をブロックリストに追加し、ブロックリストから>を削除する方法を示しています。

EXPLAINのステートメントによって返される結果を確認することで、ブロックリストが有効かどうかを確認できます ( EXPLAINの結果を理解するを参照)。

tidb> create table t(a int); Query OK, 0 rows affected (0.06 sec) tidb> 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) tidb> insert into mysql.expr_pushdown_blacklist values('date_format()', 'tikv',''), ('>','tikv',''), ('bit','tikv',''); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 tidb> admin reload expr_pushdown_blacklist; Query OK, 0 rows affected (0.00 sec) tidb> 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) tidb> delete from mysql.expr_pushdown_blacklist where name = '>'; Query OK, 1 row affected (0.01 sec) tidb> admin reload expr_pushdown_blacklist; Query OK, 0 rows affected (0.00 sec) tidb> 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)

ノート:

  • admin reload expr_pushdown_blacklistは、この SQL ステートメントを実行する TiDBサーバーでのみ有効です。すべての TiDB サーバーに適用するには、各 TiDBサーバーで SQL ステートメントを実行します。
  • 特定の式をブロックリストに登録する機能は、TiDB 3.0.0 以降のバージョンでサポートされています。
  • TiDB 3.0.3 以前のバージョンでは、一部の演算子 (">""+""is null" など) を元の名前を使用してブロックリストに追加することはサポートされていません。次の表に示すように、代わりにエイリアス (大文字と小文字を区別) を使用する必要があります。
オペレーター名エイリアス
<それ
gt
<=
=ゲー
=
!=ねえ
<>ねえ
<=>nulleq
&&ビットと
!いいえ
  • プラス
  • マイナス
    *ムル
    /分周
    DIVintdiv
    無効です無効です
    真です正しい
    偽です偽です