唯一键索引的原理是什么?

时间:2015-09-29 06:56:19

标签: mysql database postgresql sqlite relational-database

如何实现唯一键索引?

正如我所考虑的,如果列被定义为唯一键,那么每个插入都应首先搜索整列。

如果我想用Java实现它,我可以使用一种Set。如果我在启动数据库时加载唯一键索引,我认为内存应该包含一个大的Set。

编辑:据我所知,数据库将一个大表分成小表/块来存储,所以我应该将所有小表的不同值收集到一个大集中?

2 个答案:

答案 0 :(得分:3)

与大多数事情一样,它取决于数据库引擎。

在PostgreSQL中,unique索引是b树索引。 PostgreSQL查找索引以查看密钥的条目是否已存在,如果存在则报告错误。

由于并发要求和事务性插入/回滚,它比这更复杂,但这是一般的想法。它不会扫描整个列,它只是进行b树搜索。

所以说你试图插入id = 1410。

PostgreSQL查找相关的b-tree索引。它找到三个具有值范围(0-499),(500-999)和(1000-1499)的节点。它遵循第三个节点并在其下面找到五个节点,其值为(1000-1099),(1100-1199),......(1400-1499)。所以它下降到1400-1499节点,依此类推,直到它找到一个带有密钥的叶子节点......或者没有。

如果你在内存中这样做,你可能会使用由b树支持的集合(可能是红/黑树)。因此TreeSet可能是您想要的最接近的内置数据结构。您需要在树周围进行锁定以处理并发访问。

答案 1 :(得分:0)

我不认为每个插入都应该对列进行全面扫描。相反,它会搜索一小组值(不同的值)。 首先,我建议不要在JAVA中复制相同内容,因为可能存在大量数据(如果基数较低,您可能需要非常大的数据集才能搜索,这可能会导致JAVA中出现OOM错误。)

但是如果你确定数据集很小,那么创建例如用法数组,在那里存储要检查的密钥和用法标记。