【发布时间】:2014-08-04 04:50:45
【问题描述】:
我已经跟踪到 SQL 查询的 API 端点速度慢的原因,但我终生无法对其进行优化。
查询如下:
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-4200 毫秒。查询的 EXPLAIN ANALYZE 的结果可以在这里找到: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 语句呢?
谢谢!
【问题讨论】:
-
还向我们展示了索引的外观
-
@Jester 谢谢!我会更新我的问题,但我已经尝试将 IN() 分成几个“Show”。“tvdb_id”=259063 OR 等它最多节省了 10-20 毫秒:(
-
我会尝试更改 WHERE 子句的顺序,假设 user.id 的限制比 IN 的记录数少?
-
你有关于 tvdb_id 的索引吗?
标签: sql postgresql optimization