我已經得到了這三個這樣的列:表,年,pid(整數)和代碼(varchar)。想索引每一個。哪個更好(我使用的是postgres,但我對系統一般很好奇):每個三列全部使用CREATE INDEX myidx ON mytable USING btree (year, pid, code);
或去btree
個別索引?快速拋開索引和postgres
這兩種方法的含義是什麼?
我已經得到了這三個這樣的列:表,年,pid(整數)和代碼(varchar)。想索引每一個。哪個更好(我使用的是postgres,但我對系統一般很好奇):每個三列全部使用CREATE INDEX myidx ON mytable USING btree (year, pid, code);
或去btree
個別索引?快速拋開索引和postgres
這兩種方法的含義是什麼?
它們之間的差異如下。假設您有列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列
不要在隨機列上創建索引,請始終根據您使用表的方式創建索引。即如果您將使用類似SELECT ... WHERE year = 2011 AND pid = 2
的查詢,請在(year,pid)上創建一個索引。索引允許您更有效地執行某些查詢,但它也佔用磁盤空間並使插入速度變慢。
通過閱讀3 ways MySQL uses indexes和Indexes in MySQL(解釋MySQL如何處理索引),可以大致瞭解哪些索引是好的。請記住每個DBMS的工作方式會有所不同。
哪個更好
唯一有效的答案是 - 這取決於(您的使用情景,存儲的數據,列選擇性,...的量)。
這取決於你如何對它們進行查詢 - 所有列的,一個子集,每個單獨唯一的 - 和每個值中的值是唯一的還是重複的。 – Rup
我同意Rup。指標應始終建立在預期的用例上。 –