我有一个大表,多个键上有btree索引。如果通过修复索引的前两列并在第三列上放置单边绑定来进行查询,则即使匹配行的数量非常低,也会导致查询速度非常慢。如果我在第三列放置双边绑定,则查询速度很快。请参阅下面的代码段。
我希望postgresql应该能够快速找到索引列的下限,但在这种情况下似乎不是。
你能解释一下为什么我会遇到这个问题吗?如何解决?
> select min(minute) from data_minutesample where probe_id = 19 and power = 0 and minute between 0 and 22780323;
min
----------
22780262
(1 row)
Time: 28233.498 ms
> select min(minute) from data_minutesample where probe_id = 19 and power = 0 and minute between 22780000 and 22780323;
min
----------
22780262
(1 row)
Time: 13.946 ms
> \d+ data_minutesample
Table "public.data_minutesample"
[...]
Indexes:
"data_minutesample_index_unique" UNIQUE, btree (probe_id, power, minute, proto_id, src_port, dst_port, src_addr, dst_addr)
答案 0 :(得分:1)
尝试将EXPLAIN
添加到每个查询的开头,以便您可以查看查询计划程序如何决定执行它们。
我的猜测是,对于第一个,它决定不使用索引,而是进行表扫描,因为您选择了大范围的值。它可能没有意识到在该范围内实际上只有一个匹配值。
您可能会发现在桌面上运行ANALYZE
以确保规划人员拥有最新的统计信息有助于他们做出更好的决策。