提高postgresql查询的性能

时间:2017-12-03 04:09:35

标签: sql postgresql

我有3个表:postslikesSELECT 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

1 个答案:

答案 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);