说,我有一张表ResidentInfo,在这个表中我有唯一的约束HomeAddress,这是VARCHAR类型.对于将来的查询,我将在此列上添加一个索引.
查询将只有操作=,并且我将使用B-TREE模式,因为当前不推荐哈希模式.
查询将只有操作=,并且我将使用B-TREE模式,因为当前不推荐哈希模式.
问题:从效率来看,使用B-TREE,你认为我应该添加一个新的列,数字1,2,3 ….,N对应不同的homeaddress,而不是在HomeAddress中添加索引,我应该添加索引在数字列上?
我问这个问题,因为我不知道索引如何工作.
解决方法
对于简单的等式检查(=),varchar或文本列上的B-Tree索引是简单且最佳选择.它肯定有助于表现很多.
当然,一个简单整数的B-Tree索引表现更好.对于初学者,比较简单的整数值要快一些.但更重要的是,性能也是索引大小的函数.更大的列表示每个数据页的行数更少,意味着更多的页面必须被读取…
由于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的唯一索引和一个简单的地址索引.
More about indexes in the manual.Postgres提供了很多选择 – 但是您不需要再为这个简单的例子.