我很好奇,是否
CREATE INDEX idx ON tbl (columns);
与
CREATE UNIQUE INDEX idx ON tbl (columns);
扫描索引列(多个)时,或是否具有PostgreSQL中或MySQL实现中显著算法性能益处UNIQUE
关键字简单地介绍沿着索引的唯一约束。
我想这是公平地说,有一个边际效益,只要指标有可能是某种哈希1状结构,以及冲突处理的定义导致比O(1)性能的其他东西在内部实现。 在这个前提下,它很可能是,如果值的很大比例是相同比结构退化为一些线性。
所以,我的问题的目的,假设值的分布比较离散,均匀。
提前致谢!
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
。
索引总是包含某种指针行( ctid
在PostgreSQL
,排在指针MyISAM
中,主键/唯一标志InnoDB
)和叶下令这些指针,所以实际上每个索引的叶是独一无二的某种方式(虽然它可能不是很明显)。
看到这篇文章在我的博客性能的详细信息:
需要具有唯一性约束时更新/插入操作的小惩罚。 它具有插入/更新操作之前进行搜索,以确保唯一性约束不被破坏。
那么,通常索引是B-树,而不是哈希(也有基于散列索引,但最常见的指标(至少在PostgreSQL的)在B树基地)。
至于速度 - 唯一应该会更快 - 当索引扫描找到与给定值排,它并没有搜索是否有与此值的任何其他行,并能imemdiately完成扫描。