字符串列上的postgresql索引

时间:2013-06-04 17:51:12

标签: database postgresql indexing

说,我有一个表ResidentInfo,在这个表中我有唯一约束HomeAddress,它是VARCHAR类型。对于将来的查询,我将在此列上添加索引。 查询只有操作=,我将使用B-TREE模式,因为目前不建议使用哈希模式。

问题:从效率的角度来看,使用B-TREE,你认为我应该添加一个新的列,其中数字1,2,3 ....,N对应不同的homeaddress,而不是在{{1上添加索引我应该在数字列上添加索引吗?

我问这个问题,因为我不知道索引是如何工作的。

2 个答案:

答案 0 :(得分:32)

对于简单的相等性检查(=),varchartext列上的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);