プッシュダウンの式一覧
TiDB は TiKV からデータを読み取るときに、TiKV に処理されるいくつかの式 (関数または演算子の計算を含む) をプッシュダウンしようとします。これにより、転送されるデータの量が削減され、単一の TiDB ノードからの処理がオフロードされます。このドキュメントでは、TiDB が既にプッシュ ダウンをサポートしている式と、ブロックリストを使用して特定の式のプッシュ ダウンを禁止する方法を紹介します。
プッシュダウンでサポートされている式
| 式タイプ | オペレーション | 
|---|---|
| 論理演算子 | AND (&&)、OR ( | 
| 比較関数と演算子 | <、<=、=、!= ( <> )、>、>=、 <=> 、IS NULL、LIKE、IS TRUE、IS COALESCE() 、 IN() | 
| 数値関数と演算子 | +, -, *, /, ABS() , CEIL() , CEILING() , FLOOR() , MOD() | 
| 制御フロー関数 | 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、tidb、およびtiflashの 3 つのストレージ エンジンをサポートしています。store_typeは大文字と小文字を区別しません。関数が複数のストレージ エンジンにプッシュされることが禁止されている場合は、コンマを使用して各エンジンを区切ります。reason: 関数がブロックリストに登録された理由。
ブロックリストに追加
1 つ以上の関数、演算子またはデータ型 ( ENUM型とBITタイプのみ) をブロックリストに追加するには、次の手順を実行します。
以下を
mysql.expr_pushdown_blacklistに挿入します。- プッシュダウンを禁止する関数、演算子、またはデータ型の名前
 - プッシュダウンを禁止するストレージエンジン
 
admin reload expr_pushdown_blacklist;コマンドを実行します。
ブロックリストから削除
ブロックリストから 1 つ以上の関数、演算子、またはデータ型を削除するには、次の手順を実行します。
mysql.expr_pushdown_blacklistの関数、演算子、またはデータ型の名前を削除します。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 | 
| && | ビットと | 
| ! | いいえ | 
| の | の | 
| プラス | |
| マイナス | |
| * | ムル | 
| / | 分周 | 
| DIV | intdiv | 
| 無効です | 無効です | 
| 真です | 正しい | 
| 偽です | 偽です |