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

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

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

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

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

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

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

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

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

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

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

有没有朋友来讨论一下

共收到 19 条回复

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

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

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

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

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

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

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

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

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

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

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

我觉得如果记录增加的很快的话, 是必须使用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 好一些

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