【发布时间】:2020-02-19 17:57:49
【问题描述】:
假设我有一个像 Stackoverflow 这样的网站,其中包含人们可以回复的帖子,我想要一个界面来按回复计数对帖子进行排序
这最终会有无限滚动分页,所以一次显示10个结果。
这是一个示例查询:
SELECT *, (SELECT COUNT(*)
FROM post_reply pr
WHERE pr.convo_id = post.convo_id) as replies
FROM post
ORDER BY replies
LIMIT 10;
这行得通,但速度太慢了。我有数十万个帖子,这导致查询需要 30 秒才能完成。
索引会提高速度,但我不知道如何在子查询上实现索引。
物化视图也可以工作,但每次有人回复帖子时更新物化视图似乎也太慢了。
这个问题有好的解决办法吗?
【问题讨论】:
-
索引是物理数据结构,它们不存在于查询级别(除了会强制使用特定索引的查询提示)。也就是说,索引是在表上创建的,而不是子查询。您能否提供现有的表结构(如 CREATE 语句)?在 SQL Server 中,引擎将使用最小/最窄的索引来进行 COUNT。我不确定它在 postgres 中是否相同。
-
@JacobH 表结构并不多。
post和post_reply都具有convo_id字段(一对多关系),并且它们都具有TEXT正文字段。还有其他一些专栏,但它们与这个问题并不太相关。
标签: sql postgresql performance indexing sql-order-by