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

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

在更新/插入操作期间,由于具有唯一约束,会产生一些小损失。它必须在插入/更新操作之前进行搜索,以确保不违反唯一性约束。

  • 仅供参考,无论如何它都必须扫描 btree 来找到放置索引数据的页面,所以这几乎是一次清洗。 (3认同)