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

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

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

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

式の種類オペレーション
論理演算子AND(&&)、OR(
比較関数と演算子<<=、=、!=( <> )、>> =、 &#x3C;=> 、IS NULL、LIKE、IS TRUE、IS COALESCE()IN()
数値関数と演算子FLOOR() 、-、 CEIL()CEILING() MOD() 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() SYSDATE()
文字列関数RIGHT()

ブロックリスト固有の式

サポートされている式または特定のデータ型( ENUMタイプBITタイプのみ)をプッシュダウンするときに計算プロセスで予期しない動作が発生した場合、対応する関数、演算子、またはデータ型のプッシュダウンを禁止することで、アプリケーションをすばやく復元できます。具体的には、関数、演算子、またはデータ型をブロックリストに追加することで、それらがプッシュダウンされるのを禁止できます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つ以上の関数、演算子またはデータ型( ENUMタイプBITタイプのみ)をブロックリストに追加するには、次の手順を実行します。

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