如何在 postgresql 中使用哈希方法创建主键
Posted
技术标签:
【中文标题】如何在 postgresql 中使用哈希方法创建主键【英文标题】:How to create a primary key using the hash method in postgresql 【发布时间】:2014-08-25 10:20:09 【问题描述】:有什么方法可以使用哈希方法创建主键?以下两种说法均无效:
oid char(30) primary key using hash
primary key(oid) using hash
【问题讨论】:
它们为什么会起作用?您认为“使用哈希”是什么意思?您是否尝试设置散列索引(如果是,为什么)?您是在尝试“散列”一些数字键吗? 为什么需要哈希索引?它有一些严重的问题,没有任何好处。 @TomYeh“你认为”哈希更有效吗?证据?我从未见过有人表明 PostgreSQL 相当不受欢迎的哈希索引在任何方面都比 btree 更好,并且经常考虑将它们删除。不要猜测,测量。无论如何,不管你愿不愿意,你都做不到。 只是为了完整性:它们的执行几乎相同(如果您只想选择 1 行),但 btree 的实际运行时间稍低,f.ex。 sqlfiddle.com/#!15/37175/1 哈希索引可以提供比 btree 更快的查找,也许是around 40% faster。 【参考方案1】:我假设,您打算使用 hash index method / type。
主键是constraints。 一些 约束可以创建索引以正常工作(但不应依赖这一事实)。前任UNIQUE
约束将创建一个唯一索引。请注意,目前只有 B-tree 支持唯一索引。 PRIMARY KEY
约束是 UNIQUE
和 NOT NULL
约束的组合,因此(目前)它仅支持 B-tree。
如果需要,您也可以设置哈希索引(PRIMARY KEY
约束除外)——但您不能使其唯一。
CREATE INDEX name ON table USING hash (column);
但是,如果你愿意这样做,你应该知道哈希索引有一些限制(直到 PostgreSQL 10):
哈希索引操作目前没有 WAL 日志记录,因此如果有未写入的更改,可能需要在数据库崩溃后使用 REINDEX 重建哈希索引。此外,在初始基本备份之后,对哈希索引的更改不会通过流式复制或基于文件的复制进行复制,因此它们会对随后使用它们的查询给出错误的答案。由于这些原因,目前不鼓励使用哈希索引。
还有:
目前只有 B-tree、GiST 和 GIN 索引方法支持多列索引。
注意:不幸的是,oid
不是 PostgreSQL 中列的最佳名称,因为它也可以是 system column and type 的名称。
注 2:char(n)
type is also discouraged。您可以使用 varchar
或 text
代替 CHECK
约束 - 或(如果 id 非常类似于 uuid)uuid
type 本身。
【讨论】:
哈希索引操作是 WAL 记录的,从 PostgreSQL 10 开始。以上是关于如何在 postgresql 中使用哈希方法创建主键的主要内容,如果未能解决你的问题,请参考以下文章