(这个是老掉牙的问题;不许笑~)
列举一下各种分页风格。
风格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看上去最怪异,但却可能是最应该使用的。
欢迎一起来讨论老掉牙的分页问题~