mysql 物理页_mysql逻辑分页和物理分页

部分 来源 https://blog.csdn.net/yudaoai/article/details/4278030

物理分页

物理分页:在数据库执行查询时(实现分页查询),查询需要的数据 ---- 依赖数据库SQL语句,属于后台分页

Mysql /SQLServer / Oracle 每种数据库写法不同的

mysql 使用limit ,SQLServer 使用top ,Oracle使用rowNum

在MySQL数据库中offset关键字的意思是"越过",而limit关键字的意思是“限制”,利用这两者结合可轻松物理分页。

(1)取得符合条件的结果集,包含全字段。

(2)利用offset关键字越过一段结果集(被越过的结果集就是"(当前页 - 1) * 一页显示数")。

(3)利用limit关键字限制取得一段结果集(被限制取得的结果集就是一页显示数)

语法:select * from 表名 LIMIT ? , ?;

第一个参数 ? (当前页数 -1) * 当前页数要显示的数据条数

第二个参数 ? 代表的是实际页数要显示的数据条数(这一页要显示多少数据)

第一页SELECT * FROM product LIMIT 0, 3 --> 0,1,2

第二页SELECT * FROM product LIMIT 3, 3 --> 3,4,5

第三页SELECT * FROM product LIMIT 6, 3 --> 6,7,8

9, 3 ---> 9,10,11

12, 3 ---? 12,13,14

逻辑分页

逻辑分页:先查询所有数据到内存,再从内存截取需要数据 ------- 采用程序内部逻辑,属于前台分页

查询所有数据 List,   list.subList 截取你需要数据

例如:查询第11到第30条数据 list.subList(开始索引,结束索引); // 前取到,后取不到 ----- list.subList(10,30);

逻辑分页的第一种方式,利用ResultSet的滚动分页。步骤如下:

a.根据条件sql查询数据库。

b.得到ResultSet的结果集,由于ResultSet带有游标,因此可以使用其next()方法来指向下一条记录。

c.利用next()方法,得到分页所需的结果集。

逻辑分页的第二种方式

利用Scrollable ResultSets(可滚动结果集合)来快速定位到某个游标所指定的记录行,所使用的是ResultSet的absolute()方法。

/**

* 逻辑分页方法二,使用absolute()方法分页

*

* @param currentPage

* 当前页

* @param showRows

* 一页显示的数据量

*/

public ListpageListTwo(int currentPage, int showRows) {

Connection con = null;

PreparedStatement ps = null;

ResultSet rs = null;

ArrayListresultList = new ArrayList();

try {

con = getConnection();

ps = con.prepareStatement(FIND_BARS_PAGE);

rs = ps.executeQuery();

// 过滤结果集的变量

int skipBegin = (currentPage - 1) * showRows;

int skipEnd = currentPage * showRows;

// 利用rs.absolute进行定位

if (!rs.absolute(skipBegin))

return resultList;

// 当返回结果集中有记录时

while (rs.next()) {

// 以下情况将保证在结果集中有记录时的应用

if (skipBegin < skipEnd) {

Bars bar = new Bars();

bar.setId(rs.getLong("id"));

bar.setName(rs.getString("name"));

bar.setType(rs.getInt("type"));

bar.setCreatorId(rs.getLong("creator_id"));

resultList.add(bar);

if (skipBegin == skipEnd - 1)

break;

}

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (rs != null)

rs.close();

if (ps != null)

ps.close();

if (con != null)

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

return resultList;

}

对比

数据库负担

物理分页每次都访问数据库,逻辑分页只访问一次数据库,物理分页对数据库造成的负担大。

服务器负担

逻辑分页一次性将数据读取到内存,占用了较大的内容空间,物理分页每次只读取一部分数据,占用内存空间较小。

实时性

逻辑分页一次性将数据读取到内存,数据发生改变,数据库的最新状态不能实时反映到操作中,实时性差。物理分页每次需要数据时都访问数据库,能够获取数据库的最新状态,实时性强。

使用场合

逻辑分页主要用于数据量不大、数据稳定的场合,物理分页主要用于数据量较大、更新频繁的场合。

总结

物理分页速度上并不一定快于逻辑分页,逻辑分页速度上也并不一定快于物理分页。

物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来,就算速度上存在优势, 然而其它性能上的优点足以弥补这个缺点。

在分页工作前,有必要了解使用数据库本身的一些sql语句特点更好的分页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值