独特的索引是否更适合列搜索性能? (PGSQL和MySQL)

时间:2009-08-18 12:22:51

标签: postgresql mysql hash indexing

我很好奇是否

CREATE INDEX idx ON tbl (columns);

VS

CREATE UNIQUE INDEX idx ON tbl (columns);
在扫描索引列时,

在PostgreSQL或MySQL实现中具有显着的算法性能优势,或者UNIQUE关键字是否只是在索引旁边引入了唯一约束。

我认为可以公平地说,只要索引可能在内部实现为某种类似哈希 1 的结构,并且定义中的冲突处理导致存在边际效益。 O(1)表现以外的东西。鉴于这一前提,如果大部分值相同而结构退化为线性,则很可能。

因此,出于我的问题的目的,假设值的分布相对离散且均匀。

提前致谢!

1这对我来说是一个纯粹的推测,因为我不熟悉RDBM内部。

3 个答案:

答案 0 :(得分:18)

如果您的数据是唯一的,则应在其上创建UNIQUE索引。

这意味着没有额外的开销,并且在某些情况下影响优化器的决策,以便它可以选择更好的算法。

例如,在SQL ServerPostgreSQL中,如果您对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中的PostgreSQLMyISAM中的行指针,InnoDB中的主键/唯一符号)和叶子是按照这些指针排序的,所以实际上每个索引叶子都是独特的(尽管它可能并不明显)。

请参阅我的博客中有关效果详情的文章:

答案 1 :(得分:3)

在更新/插入操作期间有一个小的惩罚,因为它具有唯一约束。它必须在插入/更新操作之前进行搜索,以确保不违反唯一性约束。

答案 2 :(得分:2)

嗯,通常索引是B-Trees,而不是哈希(有基于哈希的索引,但最常见的索引(至少在PostgreSQL中)是基于B树的。)

至于速度 - 唯一应该更快 - 当索引扫描找到具有给定值的行时,它不必搜索是否存在具有此值的任何其他行,并且可以完全扫描。