感谢您的帮助。
答案 0 :(得分:3)
当然索引可以与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 组合的条件下完成的。
这通常不如多列索引高,但可以成为大型分析查询的方法。
和3. 多对多关系(也称为 m:n relationship )将始终使用映射表建模。映射表的主键通常是两个表的主键组合,请参阅此Wikipedia article。
一对多关系(也称为 1:n关系)始终使用来自“&#;许多”的外键来实现。一边走到一边'侧。