二次查询
这一次查询需要利用上一步找出来的最小值以及各自分库的最大值来构造BETWEEN查询,改写得到的SQL是:
SELECT * FROM order_tab_0 WHERE id BETWEEN 4 AND 12
SELECT * FROM order_tab_1 WHERE id BETWEEN 4 AND 11
结果:
- order_tab_0 返回 4、6、10、12。
- order_tab_1 返回 5、7、8、9、11,也就是多了 1 条数据,记住这一点。
取过来的所有数据排序之后就是4、5、6、7、8、9、10、11、12
计算最小值的全局偏移量
核心是:根据BETWEEN中多出来的数据量来推断全局偏移量
现在我们知道4在order_tab_0中的偏移量是2,也就是说比4小的数据有2条。
在BETWEEN查询里,order_tab_1返回的结果是5,7,8,9,11
,其中7在第一次查询里的偏移量是2,所以5的偏移量是1。也就是说,5的前面只有一条比4小的数据。
那么4在order_tab
中的全局偏移量就是1+2=3,也就是4前面有三条数据。
加上4本身,刚好构成了OFFSET 4,因此从5开始取,往后取4条数据。
总结
简化版本:
- 首次查询,拿到最小值
- 二次查询,确实最小值的全局偏移量
- 在二次查询的结果里根据最小值取到符合偏移量的数据