执行流程
第一步
TiDB 生成执行计划
TopN(offset 50 count 200)
↓
TableReader
↓
TopN pushdown
↓
TableFullScan
逻辑是:
Top 250
不是 200。
因为:
offset + count
第二步
TopN 下推到 TiKV
每个 Region 都会执行:
Top 250
即:
region1
返回
0-100
最多100行
region2
返回
101-200
最多100行
region3
返回
201-300
最多100行
但:
只需要
250
第三步
TiDB 汇总
收到:
100
100
100
共:
300
然后:
全局排序
得到
0-300
取:
0-250
再丢掉:
0-50
最终:
50-250
执行流程图
TiDB
Top250
↓
tikv1(region1 leader)
返回 0-100
tikv2(region2 leader)
返回 101-200
tikv3(region3 leader)
返回 201-300
↓
TiDB merge sort
↓
0-250
↓
丢掉50
↓
50-250
关键点
每个 region 都执行 TopN
不是只扫部分 region。
原因:
TiDB 不知道:
50-250 在哪个 region
必须全部参与。