oracle索引 1 B TREE索引

2021-09-01 22:45:07 字數 1308 閱讀 4837

1.b-tree索引

oracle的乙個通用索引,建立時是預設的索引選項。

可以是乙個列的(簡單)索引,也可以是組合/復合(多個列)的索引。b樹索引最多可以包括32列。

1)根節點:乙個b樹索引只有乙個根節點,它實際就是位於樹的最頂端的分支節點。

2)分支節點:最小的鍵值字首,用於在(本塊的)兩個鍵值之間做出分支選擇,指向包含所查詢鍵值的   子塊的指標。

所有的 鍵值-rowid 對都與其左右的兄弟節點鏈結,並按照(key,rowid)的順序排序

3)葉子節點:資料行的鍵值(key value)、鍵值對應資料行的 rowid

每個索引條目(也可以叫做每條記錄)都具有兩個字段。

第乙個字段表示當前該分支節點塊下面所鏈結的索引塊中所包含的最小鍵值;

在乙個分支節點塊中所能容納的記錄行數由資料塊大小以及索引鍵值的長度決定。

比如從上圖一可以看到,對於根節點塊來說,包含三條記錄,分別為(0 b1)、(500 b2)、     (1000 b3),它們指向三個分支節點塊。

其中的0、500和1000分別表示這三個分支節點塊所鏈結的鍵值的最小值。

而b1、b2和b3則表示所指向的三個分支節點塊的位址。

對於葉子節點塊來說,其所包含的索引條目與分支節點一樣,都是按照順序排列的(預設是公升序 排列,也可以在建立索引時指定為降序排列)。

每個索引條目(也可以叫做每條記錄)也具有兩個字段。

第乙個字段表示索引的鍵值,對於單列索引來說是乙個值;而對於多列索引來說則是多個值組合 在一起的。

第二個字段表示鍵值所對應的記錄行的rowid,該rowid是記錄行在表裡的實體地址。

如果索引是建立在非分割槽表上或者索引是分割槽表上的本地索引的話,則該rowid占用6個位元組;

如果索引是建立在分割槽表上的全域性索引的話,則該rowid占用10個位元組。

技巧:索引列的值都儲存在索引中。因此,可以建立乙個組合(復合)索引,這些索引可以直接滿足查詢, 而不用訪問表。這就不用從表中檢索資料,從而減少了i/o量。

b-tree 特點:適合與大量的增、刪、改(oltp)

不能用包含or操作符的查詢;

適合高基數的列(唯一值多,比如主鍵字段,每行都是唯一值)

典型的樹狀結構;

每個結點都是資料塊;

大多都是物理上一層、兩層或三層不定,邏輯上三層;

葉子塊資料是排序的,從左向右遞增;

在分支塊和根塊中放的是索引的範圍;

mysql索引hash索引和b tree索引的區別

mysql下增加索引的方式 修改表結構 alter mytable add index indexname on username length 建立表結構 create table mytable id int not null,username varchar 16 not null,index...

Oracle的b tree和bitmap索引

number型別建立乙個bitmap索引 select from test where flag 1 執行結果 table access full 12573 分析 出現全表掃瞄而沒有執行位圖索引,可能是flag為1的資料量和表的資料量相當,所以優化器將其優化掉了.varchar2型別欄位上建立乙個...

Mysql優化 B Tree索引和Hash索引

b tree和普通的b tree不大一樣。有個 可以體驗這些資料結構 先看一下b tree 設定最大深度為3,插入10個數字,資料結構如上,他與普通的二叉樹區別在於每個節點有多個資料,相當於橫向擴充套件,減少深度。為什麼要減少深度 當資料量比較大的時候,mysql無法將索引全部載入到記憶體中,只能逐...