# 执行读取 (B)

![center](./student-guide/diagram/05-Read-execution-01-02.png)

-------------------------------------------------------------
其次，执行计划会经过 DistSQL 模块，转化为一个个简单的 Select 查询，也就是将那些可能会包含 JOIN，SUBQUERY 等复杂算子，涉及很多表的执行计划抽象和包装为多个单表的查询计算任务。之后作为请求通过 TiKV Client 发送给下层 TiKV 的 Coprocessor，注意一个请求可能会涉及多个 TiKV 上的多个 Region 的查询，所以 DistSQL 模块可以将请求并行发送。

TiKV 收到请求后，会先构建一个快照（snapshot），即一个特定时间点的数据结构，查询的数据必须是最接近这个时间点的，但是不能比这个时间点新。之后按照不同请求处理查询，目前有两种方式：
  - 一类是指定查询某一行或者某几行的简单查询，这类查询会运行在 Storage Read Pool 中。
  - 另一类是复杂的聚合计算、范围查询（例如，TableScan、IndexScan、Selection、TopN、Limit、PartialAggregation 等这些可以被下推到 TiKV 节点中进行的算子），这类请求会运行在 Coprocessor Read Pool 中。

从 TiKV 5.0 版本起，默认所有的读取请求都通过 TiKV 节点中统一的线程池 UnifyRead Pool 模块进行查询，如图所示。

接下来，线程池将从 RocksDB KV 中读取数据，关于 TiKV 的 RocksDB KV 读取可以参考 Lesson 03: TiKV 中的“RocksDB - 查询”，“数据的读取 - ReadIndex Read”，“数据的读取 - Lease Read / Local Read” 和“数据的读取 - Follower Read” 中的讲解。

到此为止，DistSQL 模块请求的数据就从其所在的 TiKV 中读取出来了。