分页规范
【强制】在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
【推荐】分页优化,建议通过游标返回分页结果,避免越后面的页返回越慢的情况。
例如:
declare cur1 cursor for select name from sbtest1 where id between 100 and 1000000 order by id;
获取数据:
fetch 100 from cur1;
主键表的分页批处理(仅供参考)
常规 的分页更新 SQL 一般使用主键或者唯一索引进行排序,再配合limit … offset语法按固定行数拆分页面,然后把页面包装进独立的事务中,从而实现灵活的分页更新。但是,劣势也很明显:由于需要对主键或者唯一索引进行排序,越靠后的页面参与排序的行数就会越多,尤其当批量处理涉及的数据体量较大时,可能会占用过多计算资源。
首先将数据按照主键排序,然后调用窗口函数 row_number() 为每一行数据生成行号并按照分页大小取余,获得每个分组的下边界,最终计算出每页的最大值。
获取每页下边界:
-
select
-
x.value,
-
x.id,
-
row_number()
-
over(order by x.value, x.id) + 1 page_number
-
from (
-
select
-
t.id,
-
t.value,
-
case row_number()
-
over(order by t.value, t.id) % 500
-
when 0 then 1
-
else 0
-
end page_boundary
-
from t
-
order by t.value, t.id
-
) x
-
where x.page_boundary = 1
基于上述分页结果,后续处理只需要使用下边界的主键值查询每个分片的数据即可。如果修改数据时,也可以借助上面计算好的分片信息,实现高效数据更新。
获取第六页数据:
-
select*
-
from t
-
where (value, id) > (2, 533) -- 第五页下边界的主键值
-
order by value, id
-
limit 500
优点:规避了频繁的数据排序操作造成的性能损耗,可显著改善了批量处理的效率。