Database 字符串列上的postgresql索引

Database 字符串列上的postgresql索引,database,postgresql,indexing,Database,Postgresql,Indexing,比如说,我有一个表ResidentInfo,在这个表中我有唯一的约束homemaddress,它是VARCHAR类型。对于以后的查询,我将在此列上添加一个索引。 查询将只包含操作=,我将使用B树模式,因为目前不推荐使用哈希模式 问:从效率的角度来看,使用B-树,您认为我应该添加一个新列,其中数字1,2,3….,N对应于不同的家庭地址,而不是在家庭地址上添加索引,我应该在数字列上添加索引吗 我问这个问题是因为我不知道索引是如何工作的。在Postgres中,通过在字段上维护一个唯一的索引来强制执行一

比如说,我有一个表
ResidentInfo
,在这个表中我有唯一的约束
homemaddress
,它是
VARCHAR
类型。对于以后的查询,我将在此列上添加一个索引。 查询将只包含操作
=
,我将使用B树模式,因为目前不推荐使用哈希模式

问:从效率的角度来看,使用B-树,您认为我应该添加一个新列,其中数字1,2,3….,N对应于不同的家庭地址,而不是在
家庭地址
上添加索引,我应该在数字列上添加索引吗


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

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

如果您认为地址上的唯一限制条件不好(老实说,这是:配偶创建一个单独的账户是什么?关于不动产股票?等等),您可以这样创建一个:

create index on ResidentInfo (HomeAddress);

对于简单的相等性检查(
=
),在
varchar
text
列上的B树索引很简单,是最佳选择。这当然对性能有很大帮助

当然,简单的
整数
上的B树索引性能更好。对于初学者来说,比较简单的
integer
值要快一点。但更重要的是,业绩也是指数大小的函数。更大的列意味着每个数据页的行数更少,意味着需要读取更多的页

由于
家庭地址
无论如何都不是唯一的,因此它不是一个好的自然主键。我强烈建议使用代理主键。A是显而易见的选择。它的唯一目的是使用一个简单、快速的主键

如果您有其他表引用该表,这将变得更加高效。与复制外键列的长字符串不同,整型列只需要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树索引。
居民id上的唯一索引和
地址上的普通索引

.

Postgres提供了很多选择,但对于这个简单的案例,您不需要更多选择。

哦,谢谢您指出这一点!但问题仍然存在。如果我添加一个数字列并使用它而不是地址,查询会变得更快吗?感谢@Denis指出唯一约束将自动建立索引。根据性能,有一条准则始终适用:测试它。从如此模糊的描述中获取所有用例是不可能的,所以当你询问速度时,测试什么对你来说是最快的。在某些情况下,理论上次优的方法对于您通常处理的数据更快。非常感谢!这真的很有帮助!因此,两个B树索引将加快查询速度,如“SELECT*FROM REMINATION WHERE REMINATION_id=xxxxx;”,并为我提供一个选项,以防我必须使用地址进行查询,对吗?@Hao:正确。另外,这两个索引支持的不仅仅是简单的相等性检查。谢谢!正如您所提到的,关于B-TREE的操作,EnterpriseDB的哈希模式索引目前仍然存在缺陷,一旦他们修复了它,我可能会切换到哈希模式,因为我只使用“=”操作进行查询。取O(1)表示散列,取O(nlogn)表示B树。