关于分页的研究2

        分页这个问题在项目中常常会碰到,之前写了一篇关于分页的研究,那个主要是针对的手机端的分页处理,手机端一般采用滑动,为连续且用户不需要看到页码,也可以称为无页码分页,这次主要讲的是电脑端的分页,电脑端一般采用鼠标点击的方式,而不是采用手机端的滑动方式,这种情况一般会出现页码,这次对有页码的分页情况做一个小结。

        由于分页除了于设备的操作习惯有关,常常也与数据库操作紧密联系在一起,对于有页码的分页,也可以从与数据库的查询有关联再做细分,对于在数据库的查询操作中就进行了分页或者部分分页的归为查询中分页,对于在数据库查询之后再进行分页的情况归为查询后分页。举一个例子说明:

        假设数据库user表中有100条数据,性别为男和女,现在分页展示数据,一页展示10条数据,现在要展示第一页的数据,则需要从数据库中查出1前10条的数据,

采用查询中分页的方式为:

直接在查询的时候就指定只查前10条满足条件的数据:select * from user limit 0,10,这样就查询出的结果就可以之间返回,不需要再做处理。

采用查询后分页的方式为:

先查询出所有记录:select * from user;得到100条数据的结果集,然后在取出结果集的前10条数据。

        再加深一点,要展示的是带条件的结果,如需要展示的是性别为男的第一页数据,则也是同样带上查询条件即可。

查询中分页:select * from user where sex = '男' limit 0,10即可。

查询后分页:select * from user where sex = '男';查询出所有的男性,然后在对查询出的结果集取前10条数据。


        这两种方式都是可行的,在做项目的时候这两种分页的方式都用到了,对这两种分页的方式做一个分析,可以发现:

        查询中分页的方式是将分页的操作交给数据库处理了,而查询后分页的方式则是需要程序自己处理,由于数据库查询的效率很快,而且自己分页需要将查询的结果集放入内存,在数据量大的情况下可以查询后分页的方式性能较低,所以在数据量较大的情况下采用查询中分页较好。

        那查询后分页是不是就没有他的优势了呢?从另外一方面来看,由于查询中分页的方式在查询数据库的时候就已经进行了分页,所以查询操作是与分页操作耦合在一起的,而查询后分页则是查询结果集之后在程序中进行分页,其余数据库的查询操作是解耦的,现在数据库有很多的框架,当需要切换数据库框架时,查询中分页与框架是耦合的,切换的工作量较大,而查询后分页由于与查询是分离的,可以很方便的切换,在可移植性方面查询后分页相比查询中分页具有明显的优势。

        下面来谈下查询中分页与查询后分页的具体实现。就分页的原理比较简单,有几个关键参数,

total=总记录数,

pageSize=每页记录数,

totalPage = total/pageSize, 总记录数/每页记录数得到总页数,

currentPage 当前页数

这4参数就可以方便的实现分页。

pageSize可以在前端设置,也可以在后端配置,一般采用的是后端配置的方式。这样前后端的交互更加简单。

还是以上面的查找男性用户为例,前端需要传给后端的是查询条件和需要展示的页码数,假设现在要查找第N页的男性数据,则请求类似:http://xxxx?sex='男'&page=2

        采用查询中分页的方式收到后,先需要计算数据在结果集的起点:

start=(N-1)*pageSize+1=11;

查询的长度就是每页的记录数

count = pageSize;

查询的语句为:

select * from user where condition limit (n-1)*pageSize,pageSize;

以查询第二页男性用户为例

即从第11条数据开始,然后查询的长度为10,则采用mysql的查询为:select * from user where sex ='男' limit 10,10;

过程为:前端输入page和查询条件condition->后端根据page计算分页数据的起点和终点->查询条件中加入获取从起点到终点的条件->查询出已经分页好的数据->返回前端

得到了第二页的男性数据,其查询语句中需要用到分页的相关数据,查询的过程与分页的过程是捆绑在一起的。

这里是采用的mysql的写法,由于这种写法在其他类型的数据库中并不适用,所以对于不同的数据库来说查询中的分页方式并不完全相同,需要依据不同的数据库修改成相应的写法。可移植性降低。

        采用查询后分页的方式,收到数据后不需要计算结果集的起点,直接查询出所有满足条件的数据:

select * from user where sex = '男';

拿到结果集后,假设男性用户有60条,即total=60,查询所有男性用户后再分页。

start = (n-1)*pageSize+1=11

count = pageSize = 10

end = start +count - 1 = 20

遍历结果集,取出结果集中的第11条到20条数据,

过程为:前端输入page和查询条件condition->后端查询出满足条件的结果集->对结果集进行分页处理->返回分页好的数据给前端。

其查询语句中需要用到分页的相关数据,分页过程与查询过程是分离的。

比较两种方式可以看出,查询中分页查询过程与分页过程是同步进行的,而查询后分页方式查询过程与分页过程是分离的,

由于分页过程与查询过程分离,所以查询后分页方式的可移植性好,切换数据源后基本不用修改。





猜你喜欢

转载自blog.csdn.net/w450093854/article/details/80296867