我很想知道
CREATE INDEX idx ON tbl (columns);
v.V.
CREATE UNIQUE INDEX idx ON tbl (columns);
在扫描索引列时,PostgreSQL或MySQL实现具有显著的算法性能优势,或者UNIQUE
关键字简单地在索引旁边引入一个唯一的约束。
我想,公平地说,如果索引可能在内部实现为某种类似hash 1的结构,并且冲突处理根据定义会产生O(1)性能以外的其他东西,那么就可能会有一个边际的好处。在此前提下,如果一个大百分比的值与结构相同,则很可能会退化为线性。
因此,就我的问题而言,假设值的分布是相对离散的和均匀的。
提前谢谢!
对于我来说,这只是一个纯粹的猜测,因为我不熟悉RDBM的内部结构。
发布于 2018-03-20 12:32:45
如果数据是唯一的,则应创建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
)并且叶子是在这些指针上排序的,因此实际上每个索引叶都是唯一的(尽管它可能并不明显)。
发布于 2018-03-20 13:54:59
在UPDATE/INSERT操作中,对具有唯一约束的操作有很小的惩罚。它必须在INSERT/UPDATE操作之前进行搜索,以确保不违反唯一性约束。
https://stackoverflow.com/questions/-100007684
复制相似问题