说说分页

(这个是老掉牙的问题;不许笑~) 

列举一下各种分页风格。 

风格1. Page Number with/out PageSize 

这应该最常见的分页方式。 

ASP时代record set对象对此有直接支持;但rs实际上是从数据库中获取了所有数据,在应用中做了分页;性能极其低下(ASP.Net早期的 
DataGrid似乎也有此传统。)。 

好处:简单/易懂;往往有总页数支持,用户体验较好。 
坏处:默认可能会有性能问题可以解决,但不适合用于处理高频更新的数据。看完第一页后翻第二页时,可能又有了一页新内容,第二页显示出来还是刚刚第一页 
的内容。 

风格2: Start with PageSize 

是风格1的修改版,两者其实可以互换;但界面不一样,风格2往往不会有总页数提示;而是采用 Prev / Next的风格。 

好处跟坏处与1类似;常用于显示总条目数量无法轻易统计的场景。 

Start > 0时显示Prev链接;Next的显示比较取巧: 
永远拿PageSize + 1的数据,能够获得PageSize + 1时就Trim掉最后一条数据,并显示Next。 

风格3: Cursor with PageSize 

相对于风格1/2,这可视为是对特定应用: 
数据有按顺序排列的ID 

的特殊处理。 

比方说,列举最新注册用户,风格1/2对应的sql类似: 
MySQL: select * from users order by id desc limit 10, 20 
SqlServer: select * from (select * ,ROW_NUMBER() over (order by id 
desc) as rowNum from users ) as mytable where rowNum between 11 and 20 

但风格三对应的SQL会是: 
select top 10 * from users order by id desc where id > XXX 

性能较1/2会有本质提高。 

缺点对数据格式有要求,幸好在SNS类应用中,大多数情况都符合此要求。 

Prev需要由上一页传递Cursor(或者修改sql的where条件为id < XXX),Next依旧采用风格2中“多拿一个”的方法处理。 

风格4: Cursor with PageSize / Count 

属于风格1 + 3的混合体。 

基于风格3,但是用一个较大的PageSize,比方说100;然后再对这100条数据里面使用风格1做分页。 

在特定情况(其实也往往是最常见的情况)下风格3可以获得极高的性能,所以增加风格1的提高用户体验。 

界面上不再显示Prev / Next,而是显示上/下N页,类似Google的搜索结果页。 

风格4看上去最怪异,但却可能是最应该使用的。 

欢迎一起来讨论老掉牙的分页问题~

原文地址:https://www.cnblogs.com/wuvist/p/1686267.html