后端分页查询总结

分页查询可通过不同方式去进行,下面简单做了一下比较:

  1. 客户端分页 
    • 优点:减少了客户端和服务器交互的次数,客户端进行数据缓存,提高了系统交互性。
    • 缺点:增加了第一次交互的负荷
  2. 数据库分页 
    • 优点:每次从数据库返回较少数据,当次交互的负荷较轻。
    • 缺点:每次切页时都访问数据库,增加了数据库访问并发性。
  3. 后端分页(介于1、2之间)

    • 优点:在1、2之间达到了平衡,既减少了数据库并发又使服务器和客户端交互的当次负荷较小
    • 缺点:需要考虑数据缓存、数据同步等问题,增加了系统复杂性

其一:纯JS实现分页。

        一次性查询记录并加载到html的table中。然后通过选择性地显示某些行来达到分页显示的目的。这是一种伪分页,障眼法而已。只能用于数据少的情况下。一旦数据多了,十几万条数据加载到html中会变得很慢。而且不实时,一次加载完后数据就写死在页面了,若数据库中有变化,浏览器端显示的仍是上次加载过来的数据。

其二:一次查询,分批显示。

     就是说,我们可以执行一个数据库查询操作,得到结果集rs。然后,通过指针的移动来显示当前页面的记录。这样,就可以以   rs.absolute(当前页面号*每页记录数)定位到当前页的第一条记录,然后通过while循环显示n条记录(n为每页显示记录数)。在跳页时,只需修改currentPage,即可在重定位到下一页时把当前页面号改掉,重新定位记录指针,通过while遍历显示n条记录。与JS选择性显示不同,这里是选择性遍历。与JS分页不同的是,这里分页每次跳页修改的是遍历的指针,每次跳页都要进行一次全面查询。同样地,不适合大数据量查询。这里比JS分页优化的地方在于——实时性。每次跳页都会查询一次数据库,保证数据的实时性。

其三:在服务端分页。

        跳到第n页才查询、显示第n页内容。要点就是根据客户端表格的“页面”计算出数据库要查询的当前页面的第一条记录的位置。优点:实时性:跳页才查询。数据量小:只加载当前页的记录进行显示。

   重点在于两条语句:select count(*) from ...:查询得到记录总条数

   select * from .. limit pageNo,rowsCount:查询从第pageNo条开始的rowsCount条数据。


下面是mysql的一种实现:

 public List<PageMerge> getPersonalComment(long userId,Integer pageSize,Integer pageNum){
        Integer  pageNo = (pageNum - 1) * pageSize;
        return jdbcTemplate.query("SELECT * from pageMerge WHERE user_id = :userId ORDER BY created_at ASC LIMIT " + pageNo +":pageSize",
                new MapSqlParameterSource(FIELD_NAME_USER_ID,userId).addValue("pageSize",pageSize).addValue("pageNum",pageNum),rowMapper);
    }

后端service层:传过来currentPage后,去查询第curpage-1页的内容,查询少,显示少,这才是优势

猜你喜欢

转载自blog.csdn.net/qq_37465368/article/details/81315834