我很好奇
CREATE INDEX idx ON tbl (columns);
与
CREATE UNIQUE INDEX idx ON tbl (columns);
在扫描索引列时,Postgresql或MysqL实现中是否具有显着的算法性能优势,或者UNIQUE关键字是否在索引旁边引入了唯一的约束.
我认为可能公平地说,由于索引可能在内部实现为某种类似于hash1的结构,因此定义中的冲突处理导致O(1)性能以外的其他特性,因此有一个边际效益.在这个前提下,如果很大比例的值与结构相同,则可能会退化为线性.
所以,为了我的问题,假设价值的分布是相对离散和统一的.
提前致谢!
1对于我来说,这是一个纯粹的猜测,因为我不熟悉RDBM内部.
如果您的数据是唯一的,您应该创建一个UNIQUE索引.
这意味着没有额外的开销,并且在某些情况下影响优化器的决定,以便它可以选择更好的算法.
例如,在sql Server和Postgresql中,如果您使用UNIQUE密钥进行排序,则优化程序将忽略此后使用的ORDER BY子句(因为它们不相关),i.即这个查询:
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 )
如果othertable.othercol上有一个UNIQUE索引,它也将转换为INNER JOIN(而不是SEMI JOIN).
索引总是包含一些指向行的指针(Postgresql中的ctid,MyISAM中的行指针,InnoDB中的主键/独占数),并且叶子在这些指针上排序,因此实际上每个索引叶都是唯一的虽然可能不明显).