Ale*_*hov 22 mysql postgresql indexing hash
我很好奇是否
CREATE INDEX idx ON tbl (columns);
Run Code Online (Sandbox Code Playgroud)
与
CREATE UNIQUE INDEX idx ON tbl (columns);
Run Code Online (Sandbox Code Playgroud)
在扫描索引列时,PostgreSQL或MySQL实现具有显着的算法性能优势,或者UNIQUE关键字是否只是在索引旁边引入了唯一约束.
我想可以公平地说,只要索引很可能在内部实现为某种类似哈希1的结构,并且定义中的冲突处理会产生O(1)性能以外的其他内容,这可能是公平的.鉴于这一前提,如果大部分值相同而结构退化为线性,则很可能.
因此,出于我的问题的目的,假设值的分布是相对离散和均匀的.
提前致谢!
1对于我来说这是一个纯粹的推测问题,因为我不熟悉RDBM内部.
Qua*_*noi 19
如果您的数据是唯一的,则应UNIQUE在其上创建索引.
这意味着没有额外的开销,并且在某些情况下会影响优化器的决策,以便它可以选择更好的算法.
例如,在SQL Serverin和in中PostgreSQL,如果对UNIQUE键进行排序,优化器会忽略ORDER BY之后使用的子句(因为它们不相关),即此查询:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
将使用索引col_unique并且不会排序,other_col因为它没用.
这个查询:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
Run Code Online (Sandbox Code Playgroud)
如果有索引,也将转换为INNER JOIN(而不是a SEMI JOIN).UNIQUEothertable.othercol
索引总是包含某种指向行的指针(ctidin PostgreSQL,row pointer in MyISAM,primary key/uniquifier in InnoDB),并且叶子在这些指针上排序,所以实际上每个索引叶子都是某种方式是唯一的(尽管它可能不是很明显).
有关性能详情,请参阅我的博客中的这篇文章
小智 6
在更新/插入操作期间,由于具有唯一约束,会产生一些小损失。它必须在插入/更新操作之前进行搜索,以确保不违反唯一性约束。