2009-08-18 82 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

需要具有唯一性約束時更新/插入操作的小懲罰。它必須在插入/更新操作之前進行搜索,以確保不違反唯一性約束。