我很好奇是否
CREATE INDEX idx ON tbl (columns);
VS
CREATE UNIQUE INDEX idx ON tbl (columns);
在扫描索引列时,在PostgreSQL或MySQL实现中具有显着的算法性能优势,或者UNIQUE
关键字是否只是在索引旁边引入了唯一约束。
我认为可以公平地说,只要索引可能在内部实现为某种类似哈希 1 的结构,并且定义中的冲突处理导致存在边际效益。 O(1)表现以外的东西。鉴于这一前提,如果大部分值相同而结构退化为线性,则很可能。
因此,出于我的问题的目的,假设值的分布相对离散且均匀。
提前致谢!
1这对我来说是一个纯粹的推测,因为我不熟悉RDBM内部。
答案 0 :(得分:18)
如果您的数据是唯一的,则应在其上创建UNIQUE
索引。
这意味着没有额外的开销,并且在某些情况下影响优化器的决策,以便它可以选择更好的算法。
例如,在SQL Server
和PostgreSQL
中,如果您对UNIQUE
键进行排序,优化程序会忽略之后使用的ORDER BY
子句(因为它们不相关) ), 一世。即这个查询:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
将使用col_unique
上的索引,不会对other_col
进行排序,因为它没用。
此查询:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
如果INNER JOIN
上有SEMI JOIN
索引,也会转换为UNIQUE
(而不是othertable.othercol
)。
索引总是包含某种指向行的指针(ctid
中的PostgreSQL
,MyISAM
中的行指针,InnoDB
中的主键/唯一符号)和叶子是按照这些指针排序的,所以实际上每个索引叶子都是独特的(尽管它可能并不明显)。
请参阅我的博客中有关效果详情的文章:
答案 1 :(得分:3)
在更新/插入操作期间有一个小的惩罚,因为它具有唯一约束。它必须在插入/更新操作之前进行搜索,以确保不违反唯一性约束。
答案 2 :(得分:2)
嗯,通常索引是B-Trees,而不是哈希(有基于哈希的索引,但最常见的索引(至少在PostgreSQL中)是基于B树的。)
至于速度 - 唯一应该更快 - 当索引扫描找到具有给定值的行时,它不必搜索是否存在具有此值的任何其他行,并且可以完全扫描。