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

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

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

式の種類オペレーション
論理演算子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_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のスキーマは次のとおりです。

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はtikv 、およびtiflashtidbつのストレージエンジンをサポートしています。 store_typeでは大文字と小文字は区別されません。関数を複数のストレージエンジンにプッシュダウンすることが禁止されている場合は、コンマを使用して各エンジンを区切ります。
  • 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;コマンドを実行します。

ブロックリストの使用例

次の例は、 <>の演算子をブロックリストに追加し、 >をブロックリストから削除する方法を示しています。

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('<', 'tikv',''), ('>','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ステートメントを実行します。
  • 特定の式をブロックリストする機能は、TiDB3.0.0以降のバージョンでサポートされています。
  • TiDB 3.0.3以前のバージョンでは、元の名前を使用した一部の演算子( ">""+""is null"など)のブロックリストへの追加はサポートされていません。次の表に示すように、代わりにエイリアス(大文字と小文字を区別)を使用する必要があります。
オペレーター名エイリアス
<lt
gt
<=
=ge
=eq
!=ne
<>ne
<=>nulleq
&&ビタンド
いいえ
  • プラス
  • マイナス
    *mul
    /div
    DIVintdiv
    無効です無効です
    本当ですistrue
    偽ですisfalse

    このページは役に立ちましたか?