我的表有整数列“a”、“b”。“a”只有少数(<30)个不同的值,但对于每个“a”,存在大量不同的“b”(>10**7)。为了加快速度,我创建了复合索引 (a,b)。我观察到
select count(*) from tab where a=1;
跑得快,也
select count(*) from tab where a=2;
跑得很快,但是
select count(*) from tab where a=1 or a=2;
运行(哦,天哪)慢,同样适用
select count(*) from tab;
运行解释解释,快速查询使用
-> Index Only Scan using idx on tab
但对于慢速查询,使用顺序扫描。
为什么会这样?为什么 Postgresql 后两个查询不使用相同的索引?仅仅是查询计划器的不完善,还是不能使用 Index Only Scan 的更深层次的原因?