可以在postgresql中使用索引和子句吗?

时间:2016-06-15 12:59:03

标签: postgresql database-design relational-database

  1. 可以在postgresql上使用index和子句吗?
  2. 我真的很困惑何时应该在表关系中映射一对多或多对多映射?请提出任何建议或文章。
  3. 是否有一种理想的做法,即n:n关系应映射到带有主键和外键的映射表1:n。
  4. 感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  1. 当然索引可以与AND一起使用。两个例子:

    test=> EXPLAIN (COSTS OFF) SELECT attname FROM pg_attribute
           WHERE attrelid = 'pg_class'::regclass AND attnum = 1;
                                QUERY PLAN
    ------------------------------------------------------------------
     Index Scan using pg_attribute_relid_attnum_index on pg_attribute
       Index Cond: ((attrelid = '1259'::oid) AND (attnum = 1))
    (2 rows)
    

    这会同时对两个条件使用多列索引。

    test=> EXPLAIN (COSTS OFF) SELECT attname FROM pg_attribute
           WHERE attrelid = 'pg_class'::regclass AND attlen = 64;
                             QUERY PLAN
    ------------------------------------------------------------
     Bitmap Heap Scan on pg_attribute
       Recheck Cond: (attrelid = '1259'::oid)
       Filter: (attlen = 64)
       ->  Bitmap Index Scan on pg_attribute_relid_attnum_index
             Index Cond: (attrelid = '1259'::oid)
    (5 rows)
    

    此处索引可用于第一个条件,而第二个条件没有索引 - 它用作索引扫描的过滤器

    PostgreSQL还可以使用AND条件的索引,其中每个条件可以使用不同的索引;这是通过位图索引扫描在两个与 BitmapAnd 组合的条件下完成的。 这通常不如多列索引高,但可以成为大型分析查询的方法。

  2. 和3. 多对多关系(也称为 m:n relationship )将始终使用映射表建模。映射表的主键通常是两个表的主键组合,请参阅此Wikipedia article

    一对多关系(也称为 1:n关系)始终使用来自“&#;许多”的外键来实现。一边走到一边'侧。