跨库跨表分页
概述
随着数据量增多,势必会进行分库分表。假设 test 表有数据 [1,2,3,4,5,6,7,8],在单库的时候,查询第 2 页数据并且显示 2 条,语句是这样的:
select * from test order by id limit 2 offset 2
数据返回 [3,4],但是数据切分以后,这条语句就会有问题,例如节点 1 保存 [1,3,5,7],执行返回 [5,7],节点 2 保存 [2,4,6,8],返回 [6,8],然后排序取前两条返回 [5,6],可以看到此结果与实际结果不一致
全局查询法
将上例 sql 语句改写成:
select * from test order by id limit 4 offset 0;
因为切分后数据的索引变得更靠前了,所以要把所有数据都找出来,然后合并排序,再分页查询,然而随着页码增大,查询的压力也会增大
禁止跳页查询法
在数据量很大,翻页数很多的时候,很多产品并不提供“直接跳到指定页面”的功能,而只提供“下一页”的功能
假设 db1 中值为【2、4、6、8】,db2 中值为【1、3、5、7】,根据 id 进行排序,返回对应的条数,在内存中对各个节点返回的数据进行排序,得到需要的数据,执行以下语句,查询第一页数据,返回结果集为【1、2】
select * from test where id>0 order by id limit 2;
在查询第二页时,要根据上一页的 id 的最大值 id_max(第一页的最大 id_max 为 2),作为第二页的最小值,那么会将如下语句
select * from test order by id limit 2,2;
改写成
select * from test where id>2 order by id limit 2;
这样不会随着页数的增大而影响查询性能,但无法跳页查询