微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在我的应用程序中,我有一个主题回复表.结构大致如下:

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子句的基于索引的访问方法.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐