是唯一索引列的搜索性能更好? (PGSQL与MySQL)(Are unique indexes

2019-08-01 13:38发布

我很好奇,是否

CREATE INDEX idx ON tbl (columns);

CREATE UNIQUE INDEX idx ON tbl (columns);

扫描索引列(多个)时,或是否具有PostgreSQL中或MySQL实现中显著算法性能益处UNIQUE关键字简单地介绍沿着索引的唯一约束。

我想这是公平地说,有一个边际效益,只要指标有可能是某种哈希1状结构,以及冲突处理的定义导致比O(1)性能的其他东西在内部实现。 在这个前提下,它很可能是,如果值的很大比例是相同比结构退化为一些线性。

所以,我的问题的目的,假设值的分布比较离散,均匀。

提前致谢!

1这是对我来说纯属猜测的问题,因为我不熟悉RDBM内部。

Answer 1:

如果您的数据是唯一的,你应该创建一个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

索引总是包含某种指针行( ctidPostgreSQL ,排在指针MyISAM中,主键/唯一标志InnoDB )和叶下令这些指针,所以实际上每个索引的叶是独一无二的某种方式(虽然它可能不是很明显)。

看到这篇文章在我的博客性能的详细信息:

  • 在建立索引的UNIQUE


Answer 2:

需要具有唯一性约束时更新/插入操作的小惩罚。 它具有插入/更新操作之前进行搜索,以确保唯一性约束不被破坏。



Answer 3:

那么,通常索引是B-树,而不是哈希(也有基于散列索引,但最常见的指标(至少在PostgreSQL的)在B树基地)。

至于速度 - 唯一应该会更快 - 当索引扫描找到与给定值排,它并没有搜索是否有与此值的任何其他行,并能imemdiately完成扫描。



文章来源: Are unique indexes better for column search performance? (PGSQL & MySQL)