32

说,我有一个表ResidentInfo,在这个表中我有唯一的约束HomeAddress,即VARCHAR类型。为了将来的查询,我将在此列上添加一个索引。查询只有 operation =,我将使用 B-TREE 模式,因为目前不推荐使用 Hash 模式。

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

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

4

2 回答 2

48

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

这会产生两个 B-Tree 索引。上的唯一索引resident_id和上的普通索引address

更多关于手册中的索引
Postgres 提供了很多选项——但是对于这个简单的案例,你不再需要了。

于 2013-06-04T23:02:39.973 回答
10

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

如果您认为对地址的唯一约束不好(老实说,它是:什么配偶创建一个单独的帐户?关于 flatshares?等等),您可以像这样创建一个:

create index on ResidentInfo (HomeAddress);
于 2013-06-04T18:15:31.340 回答