TiDB分页查询流程

学用一下

对,感谢您提醒。

为什么 order by limit 慢

因为:

每个 region 都要返回 Top250

而不是:

只要200

所以:

region数越多
分页越慢

特别是:

limit 100000,10

会变成:

Top100010

非常重。

2 个赞

执行流程

第一步

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

必须全部参与。

2 个赞

应该是先分配给各个tikv进行sort吧

不加order by的话就是哪个节点先返回哪些数据就在前面了

这个优化课程有提过:select id ,k from t1 order by id limit 10;
把最大的id保存在maxid中
select id ,k from t1 where id > $maxid order by id limit 10;