2017-12-03 180 views
-2

我有3個表格:users,postslikes。如果帖子在創建後的第一個小時內有5個以上的喜歡,則該帖子被稱爲熱帖。以下是用於查詢熱門帖子的列表。任何人都可以幫助我改進這個查詢(如何索引或重寫它)。改善性能postgresql查詢

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; 
+0

@TimBiegeleisen指數:

如果規劃器選擇嵌套循環連接畢竟,它可能將查詢重寫是有用的它的工作原理。 http://prntscr.com/hidlsc –

+1

您需要爲任何人提供更多信息,以便爲您提供任何有價值的見解。例如,你的表定義,任何現有的索引(如果有的話)和'EXPLAIN'的輸出。此外,儘量不要用大寫字母給表格別名,並刪除所有雙引號(爲了便於閱讀)。 – Nicarus

+3

請** [編輯] **您的問題,併爲所討論的表格(包括所有索引)和使用**'explain(analyze,buffers)'**生成的執行計劃添加'create table'語句。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload圖像-的代碼上那麼當-要價-A-問題/ 285557#285557) –

回答

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