我已經跟蹤了一個緩慢的API端點到SQL查詢的原因,並且不能爲我的生活進行優化。如何優化這個緩慢的PostgreSQL查詢
查詢如下:
SELECT "Views".*, "Show".*, "Episode".*, "User".* FROM "Views"
LEFT OUTER JOIN "Shows" AS "Show" ON "Show"."id" = "Views"."ShowId"
LEFT OUTER JOIN "Episodes" AS "Episode" ON "Episode"."id" = "Views"."EpisodeId"
LEFT OUTER JOIN "Users" AS "User" ON "User"."id" = "Views"."UserId"
WHERE "Show"."tvdb_id" IN (259063,82066,258823,265766,261742,82283,205281,182061,121361)
AND "User"."id"=29;
它需要3000-4200ms之間完成。的EXPLAIN分析其對查詢結果可以在這裏找到:http://explain.depesz.com/s/J9R
編輯:我也曾嘗試IN()分成OR值:
SELECT "Views".*, "Show".*, "Episode".*, "User".* FROM "Views"
LEFT OUTER JOIN "Shows" AS "Show" ON "Show"."id" = "Views"."ShowId"
LEFT OUTER JOIN "Episodes" AS "Episode" ON "Episode"."id" = "Views"."EpisodeId"
LEFT OUTER JOIN "Users" AS "User" ON "User"."id" = "Views"."UserId"
WHERE
"Show"."tvdb_id"=259063 OR
"Show"."tvdb_id"=82066 OR
"Show"."tvdb_id"=258823 OR
"Show"."tvdb_id"=265766 OR
"Show"."tvdb_id"=261742 OR
"Show"."tvdb_id"=82283 OR
"Show"."tvdb_id"=205281 OR
"Show"."tvdb_id"=182061 OR
"Show"."tvdb_id"=121361
AND "User"."id"=29;
我曾嘗試在列上創建索引參考LEFT OUTER JOIN
但導致邊際收益(如果有的話)。有趣的是,我也嘗試將WHERE x IN
減少到一個WHERE x = y
,這立即改善了情況,而在200-300毫秒內做出了迴應。那麼我將如何去優化IN語句呢?
謝謝!
IN轉換爲OR – Jester
也向我們展示指標是如何尋找ATM – Jester
@Jester謝謝!我會更新我的問題,但我已經嘗試將IN()分成幾個「顯示」。「tvdb_id」= 259063或等等它最多保存10-20ms :( – Illizian