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 List pageListTwo(int currentPage, int showRows) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ArrayList resultList = 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语句特点更好的分页

你可能感兴趣的:(Mysql技术)