【发布时间】:2017-11-25 17:23:08
【问题描述】:
我们有四个表:
- 列表
- influencer_lists(加入表)
这是查询:
SELECT influencer_lists.influencer_id
FROM influencer_lists
LEFT OUTER JOIN lists ON lists.id = influencer_lists.list_id
WHERE influencer_lists.influencer_id IN (12, 95, 33, 23, 35, 36, 27, 41, 42, 43, 45, 30)
AND "lists"."user_id" = 1
在做解释的时候,要注意两点:
- 在查找影响者 ID 时,有时未使用索引
- 索引被用于
解释输出:
Nested Loop (cost=0.28..73.59 rows=9 width=4) (actual time=0.031..0.187 rows=4 loops=1)
-> Seq Scan on influencer_lists (cost=0.00..10.82 rows=9 width=8) (actual time=0.016..0.152 rows=5 loops=1)
Filter: (influencer_id = ANY ('{12,95,33,23,35,36,27,41,42,43,45,30}'::integer[]))
Rows Removed by Filter: 308
-> Index Scan using lists_pkey on lists (cost=0.28..6.96 rows=1 width=4) (actual time=0.005..0.005 rows=1 loops=5)
Index Cond: (id = influencer_lists.list_id)
Filter: (user_id = 1)
Rows Removed by Filter: 0
Planning time: 0.621 ms
Execution time: 0.235 ms
我们希望改进查询时间。我们该怎么做?
谢谢。
【问题讨论】:
-
“我们有四个表”。我数了两个。
-
您对
user_id的值有一个选择子句,它否定了outer join的效果。也许您需要将该子句从where移动到on标准。 -
使用 seq 扫描检索 300 行的成本很可能比通过索引查找要小得多。如果那是一个窄表,那么这 300 行很可能只存储在硬盘上的 3 或 4 个块中
标签: sql postgresql