我的表有问题,当我执行查询时,它有30-40m的记录:
select *
from table c
where c.column_a in (111111, 22222222, 333333333)
order by c.column_b
limit 30
它很慢。但是当我删除order by子句时,查询执行得非常快。我有两个索引:idx_column_a和多列索引idx_column-a_column_b我能做些什么来解决这个问题?
您可以通过如下重写查询来快速执行多列索引:
(select * from t c where c.column_a =1 order by c.column_b)
union all
(select * from t c where c.column_a =2 order by c.column_b)
union all
(select * from t c where c.column_a =3 order by c.column_b)
order by column_b limit 30;
遗憾的是,PostgreSQL不会用自然的查询编写方式为您生成如此快速的执行,也许有一天它会。(我给这个表起了合法的名字,减少了常数的重复性。(