在我的應用程序中,我有一個應用程序事件表,用於生成應用程序事件的用戶特定提要。因爲它是使用OR查詢生成的,所以我擔心這個大量使用的查詢的性能,並且想知道我是否正在接近這個錯誤。或使用Postgresql查詢性能和策略
在應用程序中,用戶可以關注其他用戶和組。執行操作時(例如,創建新帖子),會創建一個feed_item
記錄,其中actor_id
設置爲用戶的ID,subject_id
設置爲執行操作的組ID,actor_type
和subject_type
設置爲模型的類名稱。由於用戶可以同時關注組和用戶,因此我需要生成一個查詢來檢查actor_id和subject_id,並且需要選擇不同的記錄以避免重複。由於它是一個OR查詢,我不能使用正常的索引。而且由於每次執行操作時都會創建一條記錄,所以我希望這張表格能夠很快記錄很多記錄。
下面是當前查詢(在following
表連接用戶feeders
,又名,用戶和組)
SELECT DISTINCT feed_items.* FROM "feed_items"
INNER JOIN "followings"
ON (
(followings.feeder_id = feed_items.subject_id
AND followings.feeder_type = feed_items.subject_type)
OR
(followings.feeder_id = feed_items.actor_id
AND followings.feeder_type = feed_items.actor_type)
)
WHERE (followings.follower_id = 42) ORDER BY feed_items.created_at DESC LIMIT 30 OFFSET 0
所以我的問題:
由於這是一個頻繁使用的查詢,是這裏有性能問題?
是否有任何明顯的方法來簡化或優化我錯過的?
這似乎是使用這種方法,我需要爲每個動作創建兩個供稿項目,每個供演員和主題使用,然後過濾掉重複項,因爲當演員和主題都被跟蹤時,會返回重複項。除非我完全脫離基礎,否則我大概需要同時擁有'action_id'並執行類似於'SELECT feed_items。* FROM feed_items WHERE feed_items.action_id IN(SELECT DISTINCT fi.action_id FROM feed_items fi JOIN關注f ON f。 feeder_id = fi.id AND f.feeder_type = fi.type AND f.feeder_subtype = fi.subtype)'是正確的嗎?它比OR更好嗎? – user279603 2010-02-23 16:43:22