加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 如何使用LIMIT子句与简单地获取N个结果不同?

发布时间:2020-12-13 15:55:57 所属栏目:百科 来源:网络整理
导读:在我的应用程序中,我有一个对主题的回复表.结构大致如下: CREATE TABLE responses ( id INT NOT NULL PRIMARY KEY,topic_id INT NOT NULL,author_id INT NOT NULL,response TEXT); id是一个自动增量字段,topic_id和author_id是外键,有适当的索引等. 我总是
在我的应用程序中,我有一个对主题的回复表.结构大致如下:

CREATE TABLE responses (
    id INT NOT NULL PRIMARY KEY,topic_id INT NOT NULL,author_id INT NOT NULL,response TEXT
);

id是一个自动增量字段,topic_id和author_id是外键,有适当的索引等.

我总是想通过插入时间来订购,通常是最近的.在大多数情况下,我将按topic_id过滤.典型的查询如下所示:

SELECT * FROM responses WHERE topic_id=123 ORDER BY id DESC LIMIT 20;
-- or,for pagination:
SELECT * FROM responses WHERE topic_id=123 AND id < 456789 ORDER BY id DESC LIMIT 20;

我想实现一个阻止列表 – 每个用户都有一个他们不想看的author_id列表.我需要检索前20个结果,不包括那些回复它们的author_ids和响应.

确定是否应该排除一行是非常复杂的,虽然可能在数据库中执行此操作(在PL / SQL中或通过预处理),但我希望将逻辑保留在应用程序中.所以我可以做两件事之一:

>忘记LIMIT子句,使查询无限制.吃行直到我计算20个有效结果,然后关闭查询.
>应用分块 – 指定LIMIT 40并希望它足以获得20“好”的结果.如果没有,请获取下一个40,依此类推.

两者之间有什么实际区别? ESP.在许多同时用户的性能方面.

我在PostgreSQL中这样做,但我愿意切换到不同的RDBMS. (我不想失去参照完整性,所以我不是在研究NoSQL解决方案)也许我必须调整数据库的一些参数(例如预取大小),以充分利用无界查询案例?

解决方法

我不能谈论Postgres的细节,但查询优化器可能会使用LIMIT子句作为各种不同执行计划成本的一部分.

如果你 …

select ... from ... where ... limit n

然后优化器知道你只会检索n行,但是…

select ... from ... where ...

优化器可能会假设您需要整个结果集,可能估计数千行.

特别是我期望RDBMS支持应用LIMIT子句的基于索引的访问方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读