2011-08-22 49 views
3

我已經得到了這三個這樣的列:表,年,pid(整數)和代碼(varchar)。想索引每一個。哪個更好(我使用的是postgres,但我對系統一般很好奇):每個三列全部使用CREATE INDEX myidx ON mytable USING btree (year, pid, code);或去btree個別索引?快速拋開索引和postgres

這兩種方法的含義是什麼?

+5

這取決於你如何對它們進行查詢 - 所有列的,一個子集,每個單獨唯一的 - 和每個值中的值是唯一的還是重複的。 – Rup

+0

我同意Rup。指標應始終建立在預期的用例上。 –

回答

2

它們之間的差異如下。假設您有列A,B,C,並且您正好按照此順序放置了一個複雜索引。現在,當你做

SELECT * from table where A = .. AND B = .. AND C = 

然後索引將被使用,這是這個指數的最有效的用法。

,如果您有查詢

SELECT * from table where A = .. 

那麼該指數將仍然可以使用。然而,idnex不會(更新感謝評論:或僅部分爲第二和第三例)中使用:

SELECT * from table where B .. 
SELECT * from table where A = .. AND C = .. AND B = .. 
SELECT * from table where A = .. AND C = .. 

但是再次將用於:

SELECT * from table where A = .. AND B = .. 

希望這會有所幫助。訂單是這裏的關鍵。當然你需要什麼。如果你有三個查詢如

SELECT * ... where A 
SELECT * ... where B 
SELECT * ... where C 

然後當然在單列上做3個索引。但是如果你有和查詢,首先要確保他們有那麼相同的順序,然後繼續前進,使1個指數3列

+1

在你的第三個例子中,索引將部分用於第二個和第三個查詢 – Crack

+0

@Crack是的,這是正確的。這不是那種說法,但你是100%正確的,值得強調這一點。更新 – mkk

2

不要在隨機列上創建索引,請始終根據您使用表的方式創建索引。即如果您將使用類似SELECT ... WHERE year = 2011 AND pid = 2的查詢,請在(year,pid)上創建一個索引。索引允許您更有效地執行某些查詢,但它也佔用磁盤空間並使插入速度變慢。

通過閱讀3 ways MySQL uses indexesIndexes in MySQL(解釋MySQL如何處理索引),可以大致瞭解哪些索引是好的。請記住每個DBMS的工作方式會有所不同。

哪個更好

唯一有效的答案是 - 這取決於(您的使用情景,存儲的數據,列選擇性,...的量)。