什么类型的数据库索引有助于查询涉及两个字段的比较?

时间:2017-05-24 04:14:32

标签: postgresql

鉴于我有一个包含2个十进制字段x和y的表。 我想查询具有“x> = y”的记录。 我应该使用什么类型的索引来提高此类查询的性能?

1 个答案:

答案 0 :(得分:1)

索引仅在条件具有选择性时才有用,也就是说,只有一小部分行满足条件。否则,顺序扫描是查找匹配行的最便宜方式。

我可以想到两种方法来实现这个目标:

  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)
    
  2. 使用部分索引:

    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并且表未进行大量修改,则可以使索引仅扫描而不具有触摸桌子。缺点是指数变大了。你必须检查什么是最适合你的。

  3. 我的测试表包含1000行,其中54行符合条件。

    所以第一种方法可能会更好,因为估计值更好。 部分索引扫描仅使用表大小的三分之一的哑估计。