索引的型別

2021-08-15 12:57:32 字數 2502 閱讀 5808

為了應對不同的資料操作場景,oracle提供了若干對應的索引型別,主要的幾種型別如下:

b樹索引

位圖索引

索引組織表

逆序索引

函式索引

雜湊索引

分割槽索引(本地和全域性索引)

1. b樹索引

b樹索引是關係

資料庫中最基本的索引結構,也是

oracle

系統中最常見的索引形式。oracle提供的b樹索引既可以用來索引

資料庫表中的乙個資料列,也可以用來索引兩個以上的資料列組合,此為組合索引形式。

如圖2-21所示的示例中,b樹索引共分為三層(高度為3),根節點指向枝節點,但最終會到達帶有rowid資訊的葉節點。葉節點則包含了被索引的資料值(乙個rowid),rowid指向資料所在的具體位置(即在哪乙個oracle資料檔案、檔案中哪乙個盤區、盤區中哪乙個資料塊)。不僅如此,葉節點還儲存著指向前乙個葉節點和後乙個葉節點的指標,它們用於從兩個方向遍歷,執行範圍類掃瞄。

圖2-23 oracle獨有的索引組織表結構

由於b樹索引結構有利於執行那些精確的行資料匹配和範圍匹配的sql語句,因此,索引組織表形式有利於基於表主鍵列訪問的應用,這對於select語句,以及update和delete語句來說,效能都可以得到提高。同時,由於索引組織表的資料儲存在物理上是有序的,鍵列又是唯一的,因此索引組織表所需的儲存空間也會相應減少,這又有利於降低i/o上的操作。

另外,雖然索引組織表以主鍵列為索引列進行了索引化的儲存,但這並不會影響對該錶執行其他非主鍵列的資料查詢。同時還可以在表的其他列上建立額外索引,以利於其他sql的操作。

所以,對「簡短的」表按照索引組織結構進行儲存,是一種對錶進行物理部署優化的具體方式。

4. 逆序索引

通常,資料庫中的很多表會以資料單調遞增的列作為主鍵,例如,超市系統記載水單的「流水號」資料。這種資料具有連續遞增的特性,在程式設計時往往會用序列號物件(sequence object)生成流水號。

這種表的儲存特徵是,資料列的資料是單調、連續遞增的,且物理儲存接近,同時,該列的索引也是有序和連續的。也就是說,這種表存在表資料連續、索引資料連續的「並行」特徵。

這就會造成資料操作時的熱點i/o問題,尤其在表已經載入一定量的資料時,其效果如圖2-24所示。

圖2-24 連續的索引i/o源於連續的資料更新操作

因此,普通的b樹索引,在這種情況下會碰到與i/o爭用相關資源的一些瓶頸問題。所謂逆序索引,就是為了解決這類問題而在索引中對oracle表資料所進行的乙個逆序轉換。例如,表中的資料1000在索引中會變成0001,而表中的資料1001在索引中將變成1001。這樣,表中連續的資料1000、1001在索引中就成為了不連續的0001、1001。

逆序索引對於這種具有連續特徵的資料表來說,在消減與其關聯的i/o熱點、鎖等待方面是很有效的。

5. 函式索引

在oracle執行計畫的制定中,oracle的優化器不能對已經進行了函式處理的where條件設定索引掃瞄路徑。例如下面的sql語句:

select col1,col2,... from table where function(col1)=:x;

雖然我們可能已經在表table的col1列上建立了完整的索引,但由於where條件中function()函式對col1列的處理,使得oracle優化器將不會考慮使用col1列上的索引。不僅是oracle,其他的資料庫也基本如此。

為了應對這種情況,oracle採取了建立一種特殊索引的方法—針對函式處理過的列進行索引。就拿上例來說,我們可以針對function(col1)進行索引,這就是函式索引。如果這個索引已經存在,則前面示例中的sql語句將有可能會使用這個索引。

前面多次提到,任何索引都是把雙刃劍,不過,函式索引這把劍的「內刃」可能要更為鋒利一些。為什麼呢?如果表中的資料發生更改,索引中的資料在同步時就需要呼叫這個函式來進行維護,所以效能上的損失比一般的b樹索引要大一些。

另外,乙個函式索引只能解決這個函式在查詢中存在的呼叫問題,如果換成另外乙個函式呼叫,則這個函式索引將會失效。

所以,使用函式索引要更加小心,防止弊大於利的結果發生,在建立它們之前應考慮如下的問題:

是否需要函式索引?資料庫分析設計中列的設計是否存在問題,為什麼列需要用函式來處理?

索引導致的空間儲存增加是否值得?

函式索引的增加會對該錶上執行的dml語句帶來效能上的負面影響,可否接受這種影響?

雖然函式索引在某些場景下是非常有用的,但函式索引技術的使用不具有普遍意義(換句話說,不使用函式索引是具有普遍意義的)。我們在使用時要小心其***,表上的索引越多,則dml操作(insert、update、delete)越慢,函式索引更是如此。

對於oracle優化器來說,如果使用函式索引,則需要將其初始引數query_rewrite_enabled設定為true(這是預設值)。

6. 雜湊索引

對於oracle的簇表來說,在建立簇之前,需要先行建立乙個雜湊索引(如果是雜湊簇)。有關雜湊簇的設計和實現請參見其他的技術資料。

7. 分割槽索引

對於oracle分割槽表來說,部署在分割槽表上的索引也可能被分割槽(分割槽化對等實現)處理,用於索引那些分區內的資料。分割槽索引的設計和實現參見第9章

索引的型別

mysql中的索引有很多態別 b tree索引 當沒有特殊的說明,意味著b tree索引。b tree使用鍵生成b樹索引,當使用者查詢乙個鍵時,儲存引擎不需要進行全表搜尋,而是查詢b樹引擎。在b樹種儲存了該鍵在磁碟上的儲存位置,這樣就可以快速的定位到所查詢的資料了。舉個例子 creat table ...

Oracle索引 索引型別

oracle 提供了多種不同型別的索引以供使用。簡單地說,oracle 中包括如下索引 b 樹索引 這些是我所說的 傳統 索引。到目前為止,這是 oracle 和大多數其他資料庫中最常用的索引。b 樹的構造類似於二叉樹,能根據鍵提供一行或乙個行集的快速訪問,通常只需很少的讀操作就能找到正確的行。不過...

索引與索引型別

size large 索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 name 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資訊。索引是乙個單獨的 物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值...