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个有效结果,然后关闭查询. 两者之间有什么实际区别? ESP.在许多同时用户的性能方面. 我在PostgreSQL中这样做,但我愿意切换到不同的RDBMS. (我不想失去参照完整性,所以我不是在研究NoSQL解决方案)也许我必须调整数据库的一些参数(例如预取大小),以充分利用无界查询案例? 解决方法
我不能谈论Postgres的细节,但查询优化器可能会使用LIMIT子句作为各种不同执行计划成本的一部分.
如果你 … select ... from ... where ... limit n 然后优化器知道你只会检索n行,但是… select ... from ... where ... 优化器可能会假设您需要整个结果集,可能估计数千行. 特别是我期望RDBMS支持应用LIMIT子句的基于索引的访问方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |