Oracle 和 MySQL 中的分页查询实现
Oracle 实现分页查询
- Oracle 中有一个伪劣rownum,我们通过rownum来实现分页查询
- 一般来说,分页查询上送两个参数,currentPageNo-当前页码,pageSize-每页显示的条数
- 我们需要返回 totalSize-总条数,totalPages-总页数,及当前页的数据明细
查询总条数使用如下的脚本
select count(*) as total from david.TB_ORDER_INFO
计算总页数
// 这里进行取余数运算,如果能整除没有余数,则取整除的结果;不能整除则取整加1
if ((totalSize % pageSize) == 0) {
totalPages = totalSize / pageSize;// 能整除则取整
} else {
totalPages = totalSize / pageSize + 1;// 不能整除则取整+1
}
result.setTotalPages(totalPages);// 总页数
// 这里处理当前页码,这里为了防止当前页大于总页数的情况,重新赋值
currentPageNo = currentPageNo > totalPages ? totalPages
: currentPageNo;
查询明细信息
-- 这里使用三层嵌套查询来实现分页,rownum的值下标从1开始
select * from (select rownum rn,tb.* from(select * from david.TB_ORDER_INFO) tb where rownum<=?) where rn>=?
说明:
- 在Oracle中,我们上述的脚本显示的前后包含,且下标是从1开始的
- 举例来说,
- 第一页的内容为:1-10
- 第二页的内容为:11-20
- 第三页的内容为:21-30
计算公式为:
# 计算边界值
起始值=(当前页码-1) * 每页的条数 + 1 # 逻辑为:上一页的最后一个下标+1 为本页的起始值
结束值=起始值+每页的条数-1 # 起始值加上每页的条数-1为本页的最后一条数据下标
实现代码:
// 计算边界中的值,起始值和结束值
int begin = (currentPageNo - 1) * pageSize + 1; // 起始值=当前页码减去1乘以每页的条数再加1
int end = begin + pageSize - 1;// 结束值为起始值加上每页的条数再减一
MySQL 实现分页查询
- mysql中使用limit关键字来实现分页查询
- limit的语法为:limit m,n
- 其中m为下标,n为长度;在mysql中下标从0开始
查询总条数:
查询总条数和Oracle的方法一致
计算总页数:
计算总页数的方法和Oracle一致
进行分页查询
// 计算起始值,起始值=(当前页-1) * 每页显示的条数
(currentPageNo-1) * pageSize
说明:
- limit m,n的这种写法,当数据量比较大的时候,就容易出现效率的问题,因此数据量小的时候,可以用这种方法,当数据量上百万之后,则不能再使用,会严重的影响效率
- 数据量大了之后,我们建议采用join关键字,并且要用到数据库的索引列
- 比如我们的订单信息表,我们这里使用order_id作为我们的索引列,来实现快速的分页查询
-- 数据量小的时候使用该查询语句
select * from tb_order_info limit 690000,10;
-- 数据量大的时候,使用join进行分页查询
select tb_a.* from tb_order_info tb_a join (select order_id from tb_order_info limit 690000,10) tb_b on tb_a.order_id=tb_b.order_id;