TiDB 内核解剖室SECTION 06

同一条查询,两条路 —— 事务点查走行存,分析扫描走列存;切换三种场景,看 TiDB 怎么自动选路

1024 TiDB AIGC 黑客松 · 参赛作品 v0.2
数据流 · TP · 点查 异步复制 · Raft Learner 读前先做进度校对(轻 RPC) TiDB · Server 层 优化器按统计信息选路 读取代价估算 · 选行存 / 列存 / 混合 TiKV · 行存(Row) Region 副本组:Leader + 2 Follower 点查 · 事务写入 · 行扫描 多副本强一致 · Multi-Raft TiFlash · 列存(Column) Learner 副本 · 异步复制 分析扫描 · MPP 并行 列存 · 读前校对 · 不阻塞写入

列存副本以 Region 为单位与行存对齐:TiFlash 中的 Region 副本与 TiKV 中完全对应,且会跟随 TiKV 中的 Leader 副本同时进行分裂与合并。图中两条弧线语义不同:上弧是持续进行的异步复制,下弧是读取前的进度校对 —— 平时不读,它不打扰任何人。

三种走法 · 点一下看 TiDB 怎么选
点查走行存。小范围读写按主键 / 索引精确落到某个 Region 的 Leader 副本上:行存按行连续存放,取整行最快。这条路径上 TiFlash 不参与 —— 但注意,后台的异步复制依然在跑(图中复制通道不会停)。
分析走列存。大范围扫描 + 聚合只读命中的列,TiFlash 多节点并行执行(MPP,跨节点 data shuffle),结果由 TiDB 汇总返回。读之前,TiFlash 会先向 Leader 做一次进度校对 —— 这是「异步复制、但读得到最新数据」的关键一步。
选路由优化器决定。TiDB 可以自动选择使用 TiFlash 列存或者 TiKV 行存,甚至在同一查询内混合使用提供最佳查询速度。这个选择机制与选索引类似:根据统计信息判断读取代价并作出合理选择。

①复制通道 · 列存副本怎么跟上行存?

异步复制,不阻塞写入。TiFlash 中的副本以特殊角色(Raft Learner)进行异步的数据复制 —— 当 TiFlash 节点宕机或网络高延迟时,TiKV 的业务仍能确保正常进行。

②读一致性 · 异步复制会不会读到旧数据?

不会 —— 读前先校对。每次收到读取请求,TiFlash 中的 Region 副本会向 Leader 副本发起进度校对(一个非常轻的 RPC 请求),进度覆盖读取所需的数据之后才响应读取;读取时通过 Raft 校对索引配合 MVCC 获得 Snapshot Isolation 的一致性隔离级别。

③计算加速 · 分析为什么快?

列存 + MPP 并行。TiFlash 支持 MPP 模式的查询执行,即在计算中引入跨节点的数据交换(data shuffle 过程)。用 EXPLAIN 查看执行计划:结果里出现 ExchangeSender 与 ExchangeReceiver 算子,就表明 MPP 已生效。

④写入路径 · 数据怎么进 TiFlash?

写入必须先经过 TiKV。TiFlash 暂时无法直接接受数据写入,任何数据必须先写入 TiKV 再同步到 TiFlash;且部署后默认不会同步任何数据 —— 要按表构建副本:ALTER TABLE ... SET TIFLASH REPLICA 1。

本节口径与边界声明(技术解读准确性依据)
  • 部署前提:在 Linux AMD64 架构的硬件平台部署 TiFlash 时,CPU 必须支持 AVX2 指令集 —— 官方核对命令:grep avx2 /proc/cpuinfo 有输出;Linux ARM64 平台要求 ARMv8 架构。
  • 官方未列明角:TiFlash 副本的默认数量 —— 官方口径是「部署后默认不会同步任何数据,需按表构建副本」,未给出「默认 N 副本」;因此本作品不写「默认 N 副本」。
  • 本页的两处边界声明:① 本页是静态信息图(不是真机模拟器)—— 数据流按官方机制示意,布局与配色不代表真实网络拓扑;② 官方对复制的表述是「以低消耗不阻塞 TiKV 写入的方式,实时复制」—— 本页因此不给出任何复制延迟数值。

口径来源(已核验 · 2026-09-16 · TiDB 官方文档 stable 线 / release-8.5)
· 来源:TiFlash 简介、使用 MPP 模式(docs.pingcap.com/zh/tidb/stable)。

以上带虚线的条目均可点击,查看官方原文、适用版本与文档链接 —— 琥珀色虚线表示「官方未列明,因此本作品一个字都不写」。

系列导航:01 Multi-Raft 日志复制 · 02 Region 分裂与 PD 调度 · 03 分布式事务 2PC · 05 Raft 选举与故障转移

当前场景
TP · 点查
读路径 → TiKV 行存(Leader 副本)

按主键 / 索引定位到单个 Region,读取几十行 —— 行存直接取整行,TiFlash 不参与这条查询。

一次 AP 查询的旅程
  1. 优化器选路
    按统计信息估计读取代价,选行存 / 列存 / 混合
  2. 读前进度校对
    向 Leader 发起轻量 RPC,确认进度覆盖读取数据
  3. 跨节点并行扫描
    MPP data shuffle,多节点分摊计算
  4. 结果汇总
    TiDB 汇总存储层结果,返回客户端
关键参数 · 点开看原文

tidb_allow_mpp = on(默认)

tidb_enforce_mpp = off(默认)

部署硬性前提:CPU 支持 AVX2(Linux AMD64)