字符串列上的postgresql索引

Hao*_*Hao 24 database postgresql indexing

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

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

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

Erw*_*ter 34

对于简单的相等性检查(=),a varchartext列上的B-Tree索引很简单并且是最佳选择.这当然有助于提高性能很多.

当然,简单的B-Tree索引integer表现更好.对于初学者来说,比较简单integer值要快一些.但更重要的是,性能也是索引大小的函数.更大的列意味着每个数据页面的行数更少,意味着必须读取更多页面...

因为HomeAddress它无论如何都不是唯一的,它不是一个好的自然主键.我强烈建议使用代理主键代替.一serial是该显而易见的选择.它的唯一目的是拥有一个简单,快速的主键.

如果您有其他表引用该表,则会变得更加高效.您不需要为外键列复制冗长的字符串,而只需要整数列的4个字节.并且您不需要如此级联更新,因为地址必然会发生变化,而代理pk可以保持不变(当然也不必).

你的表格看起来像这样:

CREATE TABLE resident (
   resident_id serial PRIMARY KEY
  ,address text NOT NULL
   -- more columns
);

CREATE INDEX resident_adr_idx ON resident(address);
Run Code Online (Sandbox Code Playgroud)

这导致两个B树索引.一个唯一索引resident_id和一个普通索引address.

有关手册中索引的更多信息.
Postgres提供了很多选择 - 但是对于这个简单的案例你不再需要了.


Den*_*rdy 8

在Postgres中,通过在字段上维护唯一索引来强制执行唯一约束,因此您已经被覆盖了.

如果你决定地址的唯一约束是坏的(老实说,它是:配偶创建一个单独的帐户?关于flatshares?等),你可以创建一个如下:

create index on ResidentInfo (HomeAddress);
Run Code Online (Sandbox Code Playgroud)