# 执行计划中的算子 扫描数据类算子（A）

+ 执行计划中的算子
  + 汇聚数据类算子
  + 扫描数据类算子
    + `Point Get / Batch Point Get`
    + `Table Reader`
    + `Index Reader`
    + `Index Lookup Reader`
    + `Index Merge Reader`
  + 表连接类算子
-------------------------------------------------------------
- 汇聚数据类算子
- 扫描数据类算子
  - Point Get / Batch Point Get
  - Table Reader
  - Index Reader
  - Index Lookup Reader
  - Index Merge Reader
- 连接数据类算子
对于扫描数据类的算子，我们可以从访问对象是表还是索引的维度进行区分。
Point Get 算子
在任何场景中，Point Get 都是最优的读表算子。我们前面提到过，Point Get 的扫描在优化器预处理阶段，直接扔到执行器中，不需要进行什么优化。在 Point Get 算子中，优化器直接调用 kvget 接口进行计算，不需要走 coprocessor。
Table Reader 算子
我们可以将 Table Reader 算子类比为全表扫描算子。Table Reader 算子会直接从 TiKV 或者 TiFlash 扫描数据，相对其他算子来说，是一种比较低效的算子。我们可以通过建索引的方式避免 Table Reader 算子。
Index Reader 算子
当表中存在多个索引的时候，优化器会通过估算来找寻一个相对消耗较少的索引，这个时候，一般选择 index reader 算子。
Index Lookup Reader 算子
Index lookup reader 算子就是我们平时说的回表。因为计算的列没有被完全包含在索引中，在读索引之后需要根据 _tidb_rowid 扫描表，相比于 IndexReader 开销会多一些。
Index Merge Reader 算子
Index Merge Reader 算子是 TiDB v4.0 之后引入的一种新的扫描数据的方式。在这种访问方式下，TiDB 优化器可以选择对一张表使用多个索引，并将每个索引的返回结果进行合并。这种访问的方式能够减少大量不必要数据的扫描，提升执行效率。
