唯一的索引对列搜索性能更好吗?(PGSQL和MySQL)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我很想知道

CREATE INDEX idx ON tbl (columns);

v.V.

CREATE UNIQUE INDEX idx ON tbl (columns);

在扫描索引列时,PostgreSQL或MySQL实现具有显著的算法性能优势,或者UNIQUE关键字简单地在索引旁边引入一个唯一的约束。

我想,公平地说,如果索引可能在内部实现为某种类似hash 1的结构,并且冲突处理根据定义会产生O(1)性能以外的其他东西,那么就可能会有一个边际的好处。在此前提下,如果一个大百分比的值与结构相同,则很可能会退化为线性。

因此,就我的问题而言,假设值的分布是相对离散的和均匀的。

提前谢谢!

对于我来说,这只是一个纯粹的猜测,因为我不熟悉RDBM的内部结构。

提问于
用户回答回答于

如果数据是唯一的,则应创建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...

索引总是包含指向行的某种指针(ctidPostgreSQL中的行指针MyISAM中的主键/单位键InnoDB)并且叶子是在这些指针上排序的,因此实际上每个索引叶都是唯一的(尽管它可能并不明显)。

用户回答回答于

在UPDATE/INSERT操作中,对具有唯一约束的操作有很小的惩罚。它必须在INSERT/UPDATE操作之前进行搜索,以确保不违反唯一性约束。

扫码关注云+社区