最近我将 Postgresql 从 9.1 升级到 9.2 版本。新规划器使用错误的索引并且查询执行时间过长。
询问:
explain SELECT mentions.* FROM mentions WHERE (searches_id = 7646553) ORDER BY id ASC LIMIT 1000
9.1版本解释:
Limit (cost=5762.99..5765.49 rows=1000 width=184)
-> Sort (cost=5762.99..5842.38 rows=31755 width=184)
Sort Key: id
-> Index Scan using mentions_searches_id_idx on mentions (cost=0.00..4021.90 rows=31755 width=184)
Index Cond: (searches_id = 7646553)
在 9.2 版本中解释:
Limit (cost=0.00..450245.54 rows=1000 width=244)
-> Index Scan using mentions_pk on mentions (cost=0.00..110469543.02 rows=245354 width=244
Index Cond: (id > 0)"
Filter: (searches_id = 7646553)
正确的方法是在 9.1 版本中,规划器在 search_id 上使用索引。在 9.2 版本中,规划器不使用该索引并通过 search_id 过滤行。
当我在没有 ORDER BY id 的情况下执行 9.2 版本查询时,规划器使用 searchs_id 上的索引,但我需要按 id 排序。
我还尝试在子查询中选择行并在第二个查询中对其进行排序,但解释表明,规划器在正常查询中执行相同的操作。
select * from (
SELECT mentions.* FROM mentions WHERE (searches_id = 7646553))
AS q1
order by id asc
你会推荐什么?