我有一个包含两个WHERE子句的查询。看起来像这样:
SELECT m
FROM Media m
WHERE m.userid = :id
AND m.timestamp = (SELECT MAX(mm.timestamp)
FROM Media mm
WHERE mm.userid = :id
AND mm.source IN :sources
AND mm.timestamp < :date)
我想知道该查询使用一个索引会更快还是应该为每个WHERE
子句创建两个单独的索引?喜欢:
WHERE = (userid, timestamp)
WHERE = (userid, source, timestamp)
编辑:
我创建了2个索引。
(userid, source, timestamp)
(userid, timestamp)
当我分析查询时,它总是显示用于查询的第二个索引。
假设user.id
确实如此userid
,则理想的指标是
CREATE INDEX ON media(userid, source, timestamp);
这对于内部查询是完美的,而索引对于外部查询也非常有用。
进一步地,上面假设所有这些条件都是选择性的,也就是说,它们显着减少了结果行的数量。
根据你的情况,似乎病情mm.source IN :sources
是不是非常有选择性的,也许是因为有列只有少数不同的值,或因为你碰巧查询对于频繁发生的值。
在这种情况下,最好从索引中省略该列,因为这将使索引变小而不会造成太大损失。在其他所有条件相同的情况下,PostgreSQL将选择扫描较小的索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句