標籤:
索引方式:唯一索引,主鍵索引,多屬性索引,部分索引,運算式索引.
索引類型:B-Tree,Hash,GiST,GIN以及運算式索引
PostgreSQL所有索引都是“從屬索引”,也就是說,索引在物理上與它描述的表檔案分離。
索引也是對象,在表pg_class裡有記錄。
索引的內部結構與索引的存取方法(索引類型)相關。所有存取方法都通過頁面來組織索引的內部結構,這樣可以使用儲存管理器提供的介面來訪問索引。
索引方式
多屬性索引:如果一個索引定義多一個一個屬性,就稱為多屬性索引,用於組合查詢。
PostgreSQL中的B-Tree,GiST,GIN都支援多屬性索引。最多支援32個屬性。
不僅可以用表中的屬性,而且還可以用函數或者運算式計算得到的值作為屬性索引。
部分索引:建立在表上的子集的一個索引,該子集有一個運算式定義(運算式就是部分索引謂詞)。
CREATE INDEX STU_NAME_INX ON STUDENT(NAME) WHERE (ID > 10 AND ID <20);
使用部分索引,能夠減小索引規模,提高索引查詢效率。
運算式索引:可以建立在函數或者從表中一個或者多個屬性計算出來的標量運算式上。
CREATE INDEX STU_LOW_NAME_IDX ON STUDENT(LOWER(NAME));
運算式索引,只有在查詢是使用與建立時相同的運算式才有作用。
部分索引謂詞跟運算式索引的運算式都會儲存在pg_index表indexprs屬性中。
在建立索引的時候,會根據運算式計算出實際索引值的範圍,這會導致插入跟新速度變慢。
索引類型
B-Tree:一種類似於B+數的資料結構來儲存資料的索引值。
支援比較查詢跟範圍查詢(>,=,<)。
Hash:Hash索引會使用hash函數對索引關鍵字進行散列,Hash只能處理=操作。
GiST:通用搜尋樹,這個需要單獨來學習。
GIN:倒排索引,可以處理包含多個鍵的值(例如數組)。跟GiST類似。
索引相關係統表
pg_am:
postgres=# select count(*) from pg_am; count ------- 5(1 row)
分別為:btree,hash,gist,gin,spgist。
如果是做資料庫二次開發的,可以關注後面13個欄位,是提供13個模組的介面函數。
pg_index:
建立個索引,會再pg_class建立個添加一條記錄,也會再pg_index添加一條。
pg_index用於記錄索引的相關資訊。
幾個重要欄位說明:
indexrelid 該索引在pg_class裡的OID。
indrelid 表示索引依賴的的基表的OID。
indisvalid 為真,那麼可用於查詢,否則表示該索引不完善,需要在INSERT/UPDATE操作時更新。
indkey 這為一個數組,記錄這個索引在基表那些欄位上面建立了索引,如果數組裡有值為0,那麼索引屬性在表屬性上是一個運算式。
indexprs 索引的運算式
pg_opclass:
每一個索引類型並不直接設定該類型的索引所要操作的資料類型。該表表明了索引索引方法在操作特定資料
類型的時候,需要使用的的操作集合。
還有幾個系統檢視表,都是對索引操作類型的說明
pg_opfamily:
pg_amop:
pg_amproc:
PostgreSQL索引描述