2009-08-18 165 views
17

我很好奇,扫描索引列(S)时唯一索引对列搜索性能更好吗? (PGSQL与MySQL)

CREATE UNIQUE INDEX idx ON tbl (columns); 

是否

CREATE INDEX idx ON tbl (columns); 

与拥有的PostgreSQL或MySQL实现一个显著算法的性能优势,或关键字UNIQUE是否仅在索引旁边引入了唯一约束。

我想可能是公平的说,只要索引可能在内部实现为某种类似散列的结构,并且定义的冲突处理导致O以外的其他内容(1)表现。考虑到这个前提,如果大部分值相同,则结构可能会退化为线性。

因此,出于我的问题的目的,假定值的分布是相对离散和统一。

在此先感谢!

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

回答

15

如果你的数据是唯一的,你应该在它们上面创建一个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,行指针在MyISAMInnoDB,主键/唯一标志)和叶下令这些指针,所以实际上每个索引叶是唯一是某种方式(尽管它可能不明显)。

看到这篇文章在我的博客的性能细节:

2

嘛,平时索引是B-树,而不是哈希(有基于散列索引,但最常见的指数(至少在PostgreSQL中)是以B树为基础的)。

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

3

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