手记

关于分页的两种策略哦

基于缓存的分页策略
1) 一次性把数据全部取出来放在缓存中,根据用户要看的页数(page)和每页记录数(pageSize),计算把哪些数据输出显示。
2) 假设每页10条(pageSize = 10)
第1页: 1-10
第2页: 11-20
....
第n页: [起点] (n-1) * pageSize + 1 -- [终点] 起点 + pageSize - 1

3) 特点
 只访问数据库一次,第一次取数比较慢,以后每页都从缓存中取,比较快
比较适合小数据量,如果数据量大,对内存压力比较大。
 一次性将数据库数据读入结果集,每次查看指定的页时,要求结果集的指针能够跳到指定的的行,即指针能够跳到整个结果集的任一位置。
数据准备
表mytemp_xxx中存放数字1-105共105条数据



基于查询的分页策略
1) 每次只向数据库要求一页的数据量
2) 假设每页10条( pageSize = 10 )
第1页:1-10
第2页:11-20
....
第n页:[起点] (n - 1) * pageSize + 1 --- [终点] 起点 + pageSize - 1

3) 特点
 频繁的数据库访问。每次取数据的时间都差不多
 比较适合大数据量
 对内存压力小。
问题提出
如果要查询的是第n页 , 如何只把数据表中从[起点]到[终点]之间的数据返回? 即数据表中取起点( x )至终点( y )共( x-y )条数据的方式?

方案1:rownum( 直接使用不可行 )
rownum的特性:必须从第1行开始获取数据 , 不能从中间“截取”数据

方案2:取差集( 不可行 )
如果表中数据量不大是可以的 ;如果表中数据量过大 , 差集效率会很低( 比如我们从100万条数据 中取其中10条 )

方案3:匿名视图( 可行 )
SQL> select * from ( select id , rownum rn from mytemp_xxx ) where rn between 21 and 30 ;


MySQL数据库中的分页
rownum是Oracle独有的 , 其他数据库不能用

2) 不同的数据库取x-y条数据的方式不同

3) mysql中的分页较简单 , 方法如下:

--从第21条开始 , 取10条
SQL> select * from mytemp_xxx limit 21 , 10 ;

1人推荐
随时随地看视频
慕课网APP