鉴于我有一个包含2个十进制字段x和y的表。 我想查询具有“x> = y”的记录。 我应该使用什么类型的索引来提高此类查询的性能?
答案 0 :(得分:1)
索引仅在条件具有选择性时才有用,也就是说,只有一小部分行满足条件。否则,顺序扫描是查找匹配行的最便宜方式。
我可以想到两种方法来实现这个目标:
重写查询并创建匹配的表达式索引:
CREATE INDEX ON mytable ((x - y));
在表上运行ANALYZE
以收集索引表达式的统计信息。
然后像这样重写查询:
EXPLAIN SELECT * FROM mytable WHERE x - y >= 0;
QUERY PLAN
--------------------------------------------------------------------------------
Bitmap Heap Scan on mytable (cost=4.70..12.53 rows=55 width=20)
Recheck Cond: ((x - y) >= '0'::double precision)
-> Bitmap Index Scan on mytable_expr_idx (cost=0.00..4.69 rows=55 width=0)
Index Cond: ((x - y) >= '0'::double precision)
(4 rows)
使用部分索引:
CREATE INDEX ON mytable((bool 'TRUE')) WHERE x >= y;
再次ANALYZE
获取统计信息的表格。
此索引可与原始查询一起使用:
EXPLAIN SELECT * FROM mytable WHERE x >= y;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using mytable_bool_idx on mytable (cost=0.14..17.74 rows=333 width=20)
(1 row)
如果您索引所选列而不是(小)虚拟值TRUE
并且表未进行大量修改,则可以使索引仅扫描而不具有触摸桌子。缺点是指数变大了。你必须检查什么是最适合你的。
我的测试表包含1000行,其中54行符合条件。
所以第一种方法可能会更好,因为估计值更好。 部分索引扫描仅使用表大小的三分之一的哑估计。