说,我有一个表ResidentInfo
,在这个表中我有唯一约束HomeAddress
,它是VARCHAR
类型。对于将来的查询,我将在此列上添加索引。
查询只有操作=
,我将使用B-TREE模式,因为目前不建议使用哈希模式。
问题:从效率的角度来看,使用B-TREE,你认为我应该添加一个新的列,其中数字1,2,3 ....,N对应不同的homeaddress,而不是在{{1上添加索引我应该在数字列上添加索引吗?
我问这个问题,因为我不知道索引是如何工作的。
答案 0 :(得分:32)
对于简单的相等性检查(=
),varchar
或text
列上的B树索引很简单,也是最佳选择。它肯定有助于提高性能。
当然,简单integer
上的B-Tree索引表现更好。对于初学者来说,比较简单的integer
值要快一些。但更重要的是,性能也是索引大小的函数。较大的列意味着每个数据页面的行数较少,意味着需要读取更多页面......
由于HomeAddress
无论如何都不是唯一的,因此它不是一个好的自然主键。我强烈建议使用 代理主键 。 serial
column是明显的选择。它的唯一目的是拥有一个简单,快速的主键。
如果您有其他表引用所述表,则效率会更高。您不需要为外键列复制冗长的字符串,而只需要整数列的4个字节。并且您不需要如此级联更新,因为地址必然会发生变化,而代理pk可以保持不变(当然也不必)。
你的桌子看起来像这样:
CREATE TABLE resident (
resident_id serial PRIMARY KEY
,address text NOT NULL
-- more columns
);
CREATE INDEX resident_adr_idx ON resident(address);
这导致两个B-Tree索引。 resident_id
上的唯一索引和address
上的普通索引。
More about indexes in the manual。
Postgres提供了很多选项 - 但是对于这个简单的案例你不再需要了。
答案 1 :(得分:7)
在Postgres中,通过在字段上维护唯一索引来强制执行唯一约束,因此您已经被覆盖了。
如果您确定对地址的唯一约束是坏的(说实话,它是:配偶创建一个单独的帐户?关于flatshares?等等),您可以创建一个如此:
create index on ResidentInfo (HomeAddress);