在我的应用程序中,我有一个主题回复表。其结构大致如下:如何使用与简单获取N个结果不同的LIMIT子句?
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_id
s 以及回复他们的回复。确定一个行是否应该排除是非常复杂的,虽然它可能会在数据库中执行(PL/SQL或预处理),但我希望将逻辑保留在应用程序中。所以我可以做以下两件事之一:
- 忘记LIMIT子句,使查询不受限制。直到我计算了20个有效结果为止,然后关闭查询。
- 应用分块 - 指定LIMIT 40,并希望它足以获得20个“好”结果。如果不是,则取下40个等等。
这两者之间的实际区别是什么? ESP。在许多并发用户的性能方面。
我在PostgreSQL中这样做,但我愿意切换到不同的RDBMS。 (我不想失去引用完整性,所以我没有考虑NoSQL解决方案)也许我不得不调整数据库的某些参数(例如预取大小),以充分利用无界查询情况?
这并不直接回答你的问题,但出于好奇,你的数据模型中定义了如何“回复他们的回复”?如果您真的关心性能,最好让数据库完成它的工作,并让索引工作来过滤数据。 –
数据模型没有定义它 - 它涉及解析“reply”标签和用户名的响应文本。一行可以包含对多个其他行的回复,以及多个用户的提及。一行也可以是部分回复/回复和部分独立内容 - 在这种情况下,我想要做一些启发式猜测并隐藏部分或全部行。 我可以对此进行预处理并创建1:n响应 - 回复关系和1:n响应 - 关于提及的作者,这可能是一个足够好的数据模型。 – matejcik
至于性能方面,现在“分块”方法已经足够好了,我主要想知道在性能和便利性方面取消LIMIT子句是否是一个很好的折衷。 – matejcik