Rails 分页的话,大家觉得是用偏移量好呢,还是用页码好呢?

ShiningRay · 2012年06月04日 · 最后由 tumayun 回复于 2013年01月29日 · 6102 次阅读

假如记录数量非常巨大,有几十万甚至上百万

分页诸如/page/N 这样的链接地址,好处在于(我认为),易于 seo,并且有现成插件

但是我发现这种分页形式对于数据库、缓存来说并不友好

数据库方面:pagination 主要使用的 sql 的 limit [offset], rows,而 limit 的方式是取出 offset 之前的记录再抛弃掉,所以对于大页码来说性能是有损害的。

缓存方面,一般我们使用的都是从最新往后翻页,一页显示 X 条记录,当有新的记录出现的时候,会形成连续反应,后面的页面全都缓存失效

用户体验方面,如果出现新的记录,老的记录会被顶到后面,那么在翻页的时候,经常可以看到之前已经看到过的文章,对于用户来说很不爽。

如果使用偏移量,比如 domain.com/articles/s/N 这种形式,则可以解决以上三种问题。 如果是按 id 排序,那么就是 where articles.id < N limit rows

翻页过程中的用户,可以保持原来的翻页链接,并且能够使用缓存,如果有新记录,也不会影响翻页的体验。

但这样的坏处可能在于 SEO 上出现太多页面

有没有朋友来讨论一下

论坛的帖子列表只能用页码吧...

#1 楼 @bhuztez 可以按最后回帖时间 where last_replied_at < ... limit rows

第二种形式在生成链接时复杂吧 适用于移动端

#2 楼 @ShiningRay 有一个在下一页的帖子在你点下一页之前被回复了,这样你就看不到了 ... 相比之下我宁愿选择有重复

感觉性能未必会有什么差别吧,因为无论那种方法你都要根据时间排序。

#5 楼 @bhuztez 排序字段上面都会有索引的 关键是 offset 的问题

如果是新闻或新闻评论,用偏移量体验比较好。这种都是看一次就不再看的时效性内容。论坛的帖子有时候会收藏然后时不时翻出来看看,还是用分页比较好,想看哪页看哪页 理解错楼主的本意了 -_-|||

#5 楼 @bhuztez 如果是条目非常巨大,分页达 1000 页以上,性能就可以明显看出差别了

现在已经进入 big data 的时代了,第二种方案优势更明显,使用基于偏移量分页的貌似越来越多。,而且我个人认为体验要优先于 seo,且 seo 的最终目标也是为体验服务。

#9 楼 @lgn21st 还是 daniel 支持我~ hiahia

基于偏移量分页是那种下拉刷新的?

匿名 #12 2012年06月04日

我觉得如果记录增加的很快的话,是必须使用 from, since 之类的偏移量的,如 twitter

#8 楼 @ShiningRay 那就 1000 页之前之后分别处理

TimYang 老师有一篇关于分页的文章供参考: 用 Twitter 的 cursor 方式进行 Web 数据分页

在数据比较多时,采用偏移量应该合适一些。设计缓存时确实得细心一些了。

#14 楼 @zhangyuan #15 楼 @ShiningRay 弱弱的问一下,为什么文章的结尾说“此方法缺点是翻页时必须连续,不能跳页。”? 每一页的 cursor_id 应该可以计算的啊

查了下文档,mongodb 的 skip 和 MySQL 的 offset 一样,在大数据量时候会有问题。

看来大数据量可以果断用偏移。

#16 楼 @paranoyang 假设按照 id 排序进行翻页,如果 id 不连续,就比较麻烦了

@ShiningRay 我觉得可以先用 limitoffset 找出 id,然后在通过 id 查询分页结果,这样似乎折中了下,大数据量的时候应该比传统的 paginate 好一些

需要 登录 后方可回复, 如果你还没有账号请 注册新账号