TiDB分页查询流程

想问一下,TiDB分页查询时候,他的执行流程是啥样的啊,网上没找到相关文档
比如有4个 tikv,分别是tikv1 tikv2 tikv3 tikv4
有一张表t 他有这三个分区,并且其id数据为 t_region1(0-100)、t_region2(101-200)、t_region3(201-300)
其中
region1 在 tikv1 tikv2 tikv3
region2 在 tikv2 tikv3 tikv4
region3 在 tikv1 tikv3 tikv4

两种情况:
第一种分页查询:order by id limit 50,200 也就是50-250的数据
第二种分页查询: limit 50,200 没有排序
这执行流程是那样的啊,有参考文档吗
先感谢大佬了

第一种分页查询:order by id limit 50,200 也就是50-250的数据—这种是把所有tikv节点符合条件的数据拉回到tidb-server然后进行重排序,然后取符合条件的数据,可以保证offset的连续性
第二种分页查询: limit 50,200 没有排序—这种是不保证offset连续性的,也就是你每次查询都可能不一样的,哪个tikv返回快算谁的

3 个赞

第一种分页查询:order by id limit 50,200,这个算子下推至tikv节点,根据条件,应该每个tikv节点也只需要返回前200行(这样进一步减少资源消耗),然后汇总至tidb server在进行刷选符合条件的就可以了。

1 个赞

看执行计划就知道执行流程了

1 个赞

应该是默认按主键排序吧,刚验证了一下,每次返回结果是一样的。也可能是样本太小的缘故。 :yum:

tidb不保证返回顺序的,没有order by的话

1 个赞

你是对的,我被mysql误导了~

1 个赞

region不会只有一个把

:joy:有可能,我这边数据量都比较小。

是的,分布式的应该和mysql行为有些不一样,另外不知道有没有兼容的参数

应该是先执行数据过滤,再做排序分页的逻辑吧

你可以参考 TiDB 官方文档中关于“执行计划”和“分页查询”的部分,虽然它们没有画出你这种具体的 Region 图,但原理是一致的:

  1. TiDB 执行计划介绍:解释了 TableReader和 TableRangeScan的工作原理。
  2. 分页查询最佳实践:解释了为什么深分页慢以及如何使用主键优化。

可以试下 “Where id > 上次最大的id”
SELECT * FROM t WHERE id > 100 ORDER BY id LIMIT 200;

LSM-TREE架构的存储引擎,对于写入友好,对于读容易放大,放为数据存在多个节点。
分布式数据库,通过数据接口封装,或者直接分布式读取数据,到内存表中,再进行排序等操作。
分页是应用层实现的功能。

Limit 等价于排序规则为空的 TopN;下推到 TiKV,尽早过滤,减少网络与计算

避免大 OFFSET, 使用“游标”分页

有 ORDER BY(正确分页):
TiDB 生成 分布式 TopN → 各 TiKV 局部排序返回 TopN → TiDB 全局归并排序 → 跳过 Offset 取数据 → 稳定有序。
无 ORDER BY(错误分页):
各 TiKV 乱序返回 → TiDB 流式收集、不排序、凑够即停 → 结果无序、不稳定、不可重复。

TiDB 分页 必须加 ORDER BY,否则结果是分布式 “随机采样”,不是业务分页。

tidb返回数据不加order by是乱序的,包括使用union all也不保证顺序

是的 ,ORDER BY 不是可选项,而是分页查询的必选项