PostgreSQL数据库 - 如何按顺序和顺序查询表(无限滚动)

时间:2018-03-08 14:38:23

标签: javascript python sql database postgresql

在处理数据库时我并没有迷失,但也不是专家。

我想在我的网站上实现无限滚动,这意味着数据需要按顺序排列,可以是date_created或id descending。我最初的想法是在这样的查询中使用LIMIT和OFFSET(使用SQLalchemy):

session.query(Posts).filter(Posts.owner_id == _userid_).filter(Posts.id < post_id).orderBy(desc(Posts.id)).limit(5).all()

翻译成这样的东西:

SELECT * from posts WHERE owner_id = _userid_ AND id < _post_id_ ORDER BY id DESC LIMIT 10 OFFSET _somevalue_;

和我的js:

var minimum_post_id = 0;
var posts_list = [];
var post_ids = [];

function infinite_load(_userid_, _post_id_) {
  fetch('/users/' + _userid_ + '/posts/' + _post_id_)
  .then(r => r.json())
  .then(data => { 
     console.log(data); 
     data.posts.forEach(post => { posts_list.push(post); post_ids.push(post.id) });
     minimum_post_id = Math.min(...post_ids);
   })
}

infinite_load(1, minimum_post_id) // random user id

然而,我正在研究这是否有效并且遇到了这个问题:https://www.eversql.com/faster-pagination-in-mysql-why-order-by-with-limit-and-offset-is-slow/

基本上它说有限制和偏移是坏的,因为它仍然需要计算所有记录以抵消,只是将它们扔掉。

所以我的问题是,我的实施是否不合适?我如何有效地按顺序查询数据库?

1 个答案:

答案 0 :(得分:1)

分页 - 正确完成 - 有一些倒钩而不是简单的#34;我们在最后一页显示了什么id范围?添加10到限制和偏移。&#34;一些快速的问题可以激起你的胃口,然后提出一个建议:

  • 当用户正在查看位置为11到20的项目时,会在第15位插入记录。点击“下一步”后会返回给用户。分页按钮?

  • 相反,当用户正在查看位于101到110的记录时,下面的10个任意记录被移除。用户在“下一步”之后会得到什么?分页点击?或者以前的&#39;分页点击?

根据您的数据模型,架构和UI要求,这些可能很简单,或者真的难以回答。

现在,为什么LIMIT / OFFSET是错误的方法呢?实际上,如果你有足够小的数据集,那就不是了 - 而且对于大多数网站来说这可能是非常大的。换句话说,选择适用于 设置的内容。

同时,对于教学意义重大的&#34;真的很大&#34;数据集假设:OFFSET是该查询的杀手部分(因为它需要对结果进行统计,排序,计数,然后在LIMIT可以启动之前跳过)。那么,我们如何删除OFFSET?将其合并到查询的CONSTRAINT部分。

您的查询按ID排序,然后按某些数字抵消。通过确保ID大于(或小于)当前屏幕为用户显示的ID来删除偏移量:

SELECT * FROM posts
WHERE
    owner_id = _userid_
AND id < _last_displayed_id
ORDER BY id DESC
LIMIT 10;

同样,如果您按时间排序,那么,让您的分页按钮(或滚动处理程序)在最后一项已经呈现给用户之前/之前请求新记录。