学用一下
对,感谢您提醒。
为什么 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;