比如,我有一个表ResidentInfo,在这个表中我有唯一的约束HomeAddress,这是VARCHAR类型.为了以后的查询,我将在此列上添加一个索引.

问:从效率的Angular 来看,使用B-tree,您认为我是否应该添加一个数字为1、2、3、.、N的新列来对应不同的家庭地址,而不是在HomeAddress上添加索引,而是应该在数字列上添加索引?

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

推荐答案

对于简单的等式判断(=),varchartext列上的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上的普通索引.

More about indexes in the manual.

Database相关问答推荐

如何在Ballina中的事务失败时回滚缓存插入操作

如何使授权服务器与外部数据库保持同步?

如何高效地存储 100 万个单词并通过starts_with、contains 或ends_with 进行查询?

我们可以在 CnosDB 中的单个数据库中创建的标签数量是否有限制?

Sequel Pro / MAMP 在哪里存储本地数据库?

数据库设计 - 类别(categories)和子类别(sub-categories)

存储过程的缺点

Spring 的 JdbcTemplate 是否在查询超时后关闭连接?

MySQL 中的多个 OR 子句

关系数据库如何在幕后工作?

向表中添加大量索引是否有缺点?

如何从表列中删除唯一约束?

在 PostgreSQL 中使用 pg_notify(text, text) 监听/通知

如何在远程服务器上备份 MySQL 数据库?

哪个更重要?数据库设计或编码?

将用户数据存储在 LDAP 而不是 RDBMS 中的原因

如何从数据库中解析时间

我如何做大于/小于使用 MongoDB?

字符串列上的postgresql索引

如何在数据库中表示树状 struct