2010-06-26 92 views
1

假設我在數據庫表上有兩個查詢。關於數據庫表中部分鍵和索引的問題

查詢1:

查詢是在查詢中使用的字段來定義依賴於F1,F2,和F3

QUERY2:取決於F1,F2,F3和F4

我記得在某處讀到SQL查詢引擎(本例中爲mySQL)從索引中最左邊的字段開始解析索引樹。

如果這是正確的,那麼我認爲,而不必像這樣在桌子上定義了兩個指標:

Index 1 (for Query1) : CREATE INDEX idx_1 {f1, f2, f3} 
Index 2 (for Query2) : CREATE INDEX idx_2 {f1, f2, f3, f4} 

我可以簡單地定義包含兩個查詢中使用的密鑰的工會一個指標 - 即

我只需要定義這個索引:

(for BOTH Query1) : CREATE INDEX the_idx {f1, f2, f3, f4} 

我有兩個問題:

  1. 我的假設是否正確?即我可以簡單地定義一個索引(the_idx)而不是前兩個?

  2. 此索引行爲是否適用於PostgreSQL查詢引擎?

+0

這個假設是關於B-TREE的,而不是其他類型的索引。維基百科有關於HASH,GIN,GIST,RED-BLACK等的信息。深入瞭解數據庫的手冊,它還包含有關索引實現的更多信息。 – 2010-06-26 16:56:59

回答

1

我的假設是否正確?即我可以簡單地定義一個索引(the_idx)而不是前兩個?

是的。
它被稱爲覆蓋索引,並且您想要根據最可能使用查詢的列來排序。 IE:如果F2是最常見的列,你想使用:

CREATE INDEX the_idx {f2, f1, f3, f4} 

這是否索引行爲PostgreSQL的查詢引擎保持爲真呢?

不,Postgres does not support covering indexes

索引不是ANSI標準;這是一個奇蹟,這個術語在供應商之間是如此一致。

0

一般來說,人口較多的指數將是可用的。但是,您添加到該索引的次數越多,需要的開銷就越多。

最好的辦法是嘗試一下,看看執行計劃,看看它是否以你期望的方式使用。

根據結果集中返回的實際列,使用更短的索引可能更有利。

0

MySQL manual可以合理地清楚是的,可以在任何非哈希索引(大多數)中搜索關鍵字的任何「前綴」。

我找不到PostgreSQL的任何可比較的文檔,但您始終可以創建表格然後做一個EXPLAIN(無論如何不是一個壞主意)。