# 表达式下推

__*TiKV 表达式下推*__

+ 向 **TiKV** 下推表达式
  + 当 TiDB 从 TiKV 中读取数据的时候, TiDB 会尽量下推一些表达式运算到 TiKV 中, 从而减少数据传输量以及 TiDB 单一节点的计算压力
  + 逻辑运算: `AND (&&)`, `OR (||)`, `NOT (!)`
  + 比较运算: `<`, `<=`, `=`, `!= (<>)`, `>`, `>=`, `<=>`, `IN()`, `IS NULL`, `LIKE`, `IS TRUE`, `IS FALSE`, `COALESCE()`
  + 数值运算:`+`, `-`, `*`, `/`, `ABS()`, `CEIL()`, `CEILING()`, `FLOOR()`
  + 控制流运算:`CASE`, `IF()`, `IFNULL()`
  + 日期运算: `DATE_FORMAT()`
+ 通过观察执行计划中任务字段的 **task.cop[tikv]** 来确定运算是否支持表达式下推
----------------------------------------------------------------------
例如,观察以下两个执行计划的区别:

```
tidb> EXPLAIN SELECT name, mass from universe.planets WHERE name RLIKE 'M.*';
+-------------------------+---------+-----------+---------------+--------------------------------------+
| id                      | estRows | task      | access object | operator info                        |
+-------------------------+---------+-----------+---------------+--------------------------------------+
| Selection_5             | 8.00    | root      |               | regexp(universe.planets.name, "M.*") |
| └─TableReader_7         | 10.00   | root      |               | data:TableFullScan_6                 |
|   └─TableFullScan_6     | 10.00   | cop[tikv] | table:planets | keep order:false, stats:pseudo       |
+-------------------------+---------+-----------+---------------+--------------------------------------+
3 rows in set, 1 warning (0.00 sec)

tidb> EXPLAIN SELECT name, mass from universe.planets WHERE name LIKE 'M%';
+-------------------------------+---------+-----------+---------------------------------+-------------------------------------------------+
| id                            | estRows | task      | access object                   | operator info                                   |
+-------------------------------+---------+-----------+---------------------------------+-------------------------------------------------+
| IndexLookUp_10                | 0.25    | root      |                                 |                                                 |
| ├─IndexRangeScan_8(Build)     | 0.25    | cop[tikv] | table:planets, index:name(name) | range:["M","N"), keep order:false, stats:pseudo |
| └─TableRowIDScan_9(Probe)     | 0.25    | cop[tikv] | table:planets                   | keep order:false, stats:pseudo                  |
+-------------------------------+---------+-----------+---------------------------------+-------------------------------------------------+
3 rows in set (0.00 sec)
```