我有3个表:posts
,likes
和SELECT post.id,
post.content,
user.username,
COUNT(like.id)
FROM posts AS post
LEFT OUTER JOIN users AS user
ON post.user_id = user.id
INNER JOIN likes AS likes
ON post.id = likes.post_id
AND likes.created_at - INTERVAL '1 hour' < post.created_at
GROUP BY post.id, user.username
HAVING COUNT(like.id) >= 5
ORDER BY post.created_at DESC;
。如果帖子在帖子创建后的第一个小时内有超过5个喜欢,则该帖子称为热门帖子。以下用于查询热门帖子列表。任何人都可以帮我改进这个查询(如何索引或重写它)。
extract-text-webpack-plugin
答案 0 :(得分:1)
首先,除非确实存在不属于用户的帖子,否则请使用内部联接。
假设有很多帖子和喜欢,最好的连接策略是合并连接或散列连接,PostgreSQL应该自动选择。
对于合并连接,以下索引可能会有所帮助:
CREATE INDEX ON posts (id);
CREATE INDEX ON likes (post_id);
在这种情况下,没有索引可以帮助进行散列连接。
如果规划器毕竟选择了嵌套循环连接,则将查询重写为:
可能很有用。... AND likes.created_at < post.created_at + INTERVAL '1 hour'
并创建一个像
这样的索引CREATE INDEX ON likes (post_id, created_at);