分页查询

Posted bluestarwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分页查询相关的知识,希望对你有一定的参考价值。

 

     分页查询主要有两种形式:逻辑分页、物理分页。

1.逻辑分页

    1.1 含义:一次性查出所有的数据,然后在代码逻辑中进行处理,根据页码和展示的数量决定具体显示哪几条数据

    1.2 优点:查询效率快【直接从内存中读取】

    1.3 局限性: 占用大量内存,降低服务器的性能

 

2. 物理分页【推荐使用

    2.1 含义:根据数据库提供的分页功能查询出需要显示的具体数据【即:只查询当前页面显示的数据

    2.2 优点: 不影响服务器性能

    2.3 局限性:  查询速率相对较慢【每次翻页都需要与数据库进行交互

    2.4 Oracle实现:

SELECT * FROM (
  SELECT ROWNUM AS NUM, T.* FROM (
    SELECT * FROM T_USER ORDER BY ID ) T
   WHERE ROWNUM <= endIndex)
WHERE NUM > startIndex

        2.4.1 原理: 三层嵌套查询 + ROWNUM

        2.4.2 三层嵌套查询的作用及原因:(由内向外)

 

作用

原因

第一层

排序

ORDER BY不能放在WHERE前面

第二层

取endindex条记录,并将ROWNUM变为实际显示列

ROWNUM为隐藏列,不支持 >或 >=

第三层

截取需要的子集

获取最终结果集

    2.5 mysql实现

SELECT * FROM actor ORDER BY first_name LIMIT startIndex,pageSize

 

3. 补充

    3.1 子查询效率低,尽量减少子查询的使用

          例如:Oracle分页可以做以下优化

        3.1.1 不需要排序,查询第一页

SELECT * FROM T_USER ROWNUM < endIndex

        3.1.2 不需要排序,查询后面几页

SELECT * FROM (
  SELECT ROWNUM AS NUM, T.* FROM T_USER T WHERE ROWNUM < endIndex)
WHERE NUM > startIndex

        3.1.3 需要排序,查询第一页

SELECT * FROM (
   SELECT * FROM T_USER ORDER BY ID ) 
WHERE ROWNUM <= endIndex

        3.1.4 需要排序,查询后面几页

SELECT * FROM (
  SELECT ROWNUM AS NUM, T.* FROM (
    SELECT * FROM T_USER ORDER BY ID ) T
  WHERE ROWNUM <= endIndex)
WHERE NUM > startIndex

    3.2 推荐使用物理查询的原因:

        3.2.1 逻辑分页查询一次性将数据全部读到内存中,占用大量的系统资源(尤其是数据很多的时候),影响其他软件的使用,降低服务器的性能

        3.2.2 物理分页查询只是在翻页的时候速率较慢,但是翻页操作使用并不频繁,相对于逻辑查询降低服务器性能,该影响基本可以忽略

以上是关于分页查询的主要内容,如果未能解决你的问题,请参考以下文章

片段被视图分页器布局切割

Laravel 分页 数据丢失问题解决

MyBatis动态SQL标签用法

Symfony2 将哈希片段参数附加到分页 URL

FragmentStatePagerAdapter 视图分页器片段在活动重新创建后不显示

java web 分页查询