惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
C
Check Point Blog
Vercel News
Vercel News
Y
Y Combinator Blog
G
Google Developers Blog
P
Proofpoint News Feed
WordPress大学
WordPress大学
MongoDB | Blog
MongoDB | Blog
博客园 - 司徒正美
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
L
LangChain Blog
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
博客园_首页
B
Blog RSS Feed
The Cloudflare Blog
MyScale Blog
MyScale Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Security Blog
Microsoft Security Blog

博客园 - 问天

开发笔记1: 范型 C#范型不会用,求助~ Web安全,以新浪微博“郭美美”蠕虫为例 介绍两个Python web框架:Django & Tornado 扯一下抽象 跟赵姐夫扯 webform的设计 MoSonic:对SubSonic的分布式存储、缓存改进尝试(4) MoSonic:对SubSonic的分布式存储、缓存改进尝试(3) MoSonic:对SubSonic的分布式存储、缓存改进尝试(2) MoSonic:对SubSonic的分布式存储、缓存改进方案尝试(1) Discuz!NT在64位Windows下运行的问题 iPhone Web App开发杂感 Katze - 简单的.net "ORM"框架 基于Gettext的asp.net网站多语言解决方案 Django on IronPython and Windows 动态修改.Net StreamReader Encoding编码 恐怖的迅雷 TinyMCE 的音乐插件/mp3 music insert plugin 微软是如何输掉API之战(下)
说说分页
问天 · 2010-03-15 · via 博客园 - 问天

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

列举一下各种分页风格。 

风格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看上去最怪异,但却可能是最应该使用的。 

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