プッシュダウンの式のリスト
TiDBがTiKVからデータを読み取るとき、TiDBは処理されるいくつかの式(関数または演算子の計算を含む)をTiKVにプッシュダウンしようとします。これにより、転送されるデータの量が減り、単一のTiDBノードからの処理がオフロードされます。このドキュメントでは、TiDBがすでにプッシュダウンをサポートしている式と、ブロックリストを使用して特定の式がプッシュダウンされるのを禁止する方法を紹介します。
プッシュダウンでサポートされる式
ブロックリスト固有の式
プッシュダウンが原因で関数の計算中に予期しない動作が発生した場合は、その関数をブロックリストに登録することで、アプリケーションをすばやく復元できます。具体的には、対応する関数または演算子をブロックリスト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
、およびtiflash
のtidb
つのストレージエンジンをサポートしています。store_type
では大文字と小文字は区別されません。関数を複数のストレージエンジンにプッシュダウンすることが禁止されている場合は、コンマを使用して各エンジンを区切ります。reason
:関数がブロックリストに登録されている理由。
ブロックリストに追加
1つ以上の関数または演算子をブロックリストに追加するには、次の手順を実行します。
関数または演算子の名前と、関数のプッシュダウンで禁止するストレージタイプのコレクションを
mysql.expr_pushdown_blacklist
に挿入します。admin reload expr_pushdown_blacklist;
コマンドを実行します。
ブロックリストから削除する
ブロックリストから1つ以上の関数または演算子を削除するには、次の手順を実行します。
mysql.expr_pushdown_blacklist
の関数または演算子名を削除します。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 |
DIV | intdiv |
無効です | 無効です |
本当です | istrue |
偽です | isfalse |