第一次查询的时候ORDER BY ID LIMIT 10 OFFSET 0,那么下一页就可以改为WHERE id > max_id ORDER BY ID LIMIT 10 OFFSET 0。在现在的手机 App 里这个策略是非常好用的,因为手机 App 都是下拉刷新,天然就不存在跨页的问题。
第一部分提到了极值,面试官可能问你什么时候用最大值,什么时候用最小值,可以这样说:
至于用最大值还是最小值,取决于order by。总的原则就是升序用最大值,降序用最小值。如果order by里面包含了多个列,那么针对每一个列是升序还是降序,来确定使用最大值还是最小值。
这种方案并没有彻底解决分库分表查询中的分页问题,但是控制了偏移量,极大的减少了网络通信的消耗和磁盘扫描的消耗。
一种思路是使用NoSQL之类的来存储数据,比如使用Elasticsearch、ClickHouse;另一种思路是使用分布式关系型数据库,相当于把分页的难题抛给了数据库
先尝试获取某个数据的全局偏移量,再根据这个偏移量来计算剩下数据的偏移量。这里用一个例子来阐述它的基本原理,再抽象出一般步骤。
假设我们的查询是
SELECT * FROM order_tab ORDER BY id LIMIT 4 OFFSET 4
数据分布如图所示:
全局的LIMIT 4 OFFSET 4 是 5、6、7、8 四条数据
首次查询
把SQL语句改写成这样:
SELECT * FROM order_tab_0 ORDER BY id LIMIT 4 OFFSET 2
SELECT * FROM order_tab_1 ORDER BY id LIMIT 4 OFFSET 2
我们只是把OFFSET平均分配了,但是LIMIT没变
第一次查询到的数据是这样
order_tab_0 拿到了 4、6、10、12,而 order_tab_1 拿到了 7、8、9、11
确认最小值
id最小的是4,来自order_tab_0