比如,我有一个表ResidentInfo
,在这个表中我有唯一的约束HomeAddress
,这是VARCHAR
类型.为了以后的查询,我将在此列上添加一个索引.
问:从效率的Angular 来看,使用B-tree,您认为我是否应该添加一个数字为1、2、3、.、N的新列来对应不同的家庭地址,而不是在HomeAddress
上添加索引,而是应该在数字列上添加索引?
我问这个问题是因为我不知道索引是如何工作的.
比如,我有一个表ResidentInfo
,在这个表中我有唯一的约束HomeAddress
,这是VARCHAR
类型.为了以后的查询,我将在此列上添加一个索引.
问:从效率的Angular 来看,使用B-tree,您认为我是否应该添加一个数字为1、2、3、.、N的新列来对应不同的家庭地址,而不是在HomeAddress
上添加索引,而是应该在数字列上添加索引?
我问这个问题是因为我不知道索引是如何工作的.
对于简单的等式判断(=
),varchar
或text
列上的B树索引很简单,是最佳 Select .这当然有助于提高绩效.
当然,简单integer
上的B-Tree索引执行得更好.对于初学者来说,比较简单的integer
个值会更快一些.但更重要的是,业绩也是指数规模的函数.列越大,每个数据页的行数就越少,意味着需要读取的页面就越多……
因为HomeAddress
并不是唯一的,所以它不是一个好的自然主键.我强烈建议使用surrogate primary key.serial
column分显然是最好的 Select .它的唯一目的是使用一个简单、快速的主键.
如果有其他表引用该表,则效率会更高.对于整型列,您只需要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树索引.resident_id
上的唯一索引和address
上的普通索引.