一:b-樹是一種平衡的多路查詢樹,它在檔案系統中很有用。
定義:一棵m 階的b-樹,或者為空樹,或為滿足下列特性的m 叉樹:
⑴樹中每個結點至多有m 棵子樹。
⑵若根結點不是葉子結點,則至少有兩棵子樹。
⑶除根結點之外的所有非葉結點至少有[m/2] 棵子樹;
⑷所有的非終端結點中包含以下資訊資料:(n,a0,k1,a1,k2,…,kn,an)
其中:n 為關鍵碼的個數,ki(i=1,2,…,n)為關鍵碼且ki⑸所有的葉子結點都出現在同一層次上,並且不帶資訊(實際上這些結點不存在,指向這些結點的指標為空)。即所有葉節點具有相同的深度,等於樹高度。
如一棵四階b-樹,其深度為4,如下圖:
b-樹的查詢類似二叉排序樹的查詢,所不同的是b-樹每個結點上是多關鍵碼的有序表,在到達某個結點時,先在有序表中查詢,若找到,則查詢成功;否則,到按照對應的指標資訊指向的子樹中去查詢,當到達葉子結點時,則說明樹中沒有對應的關鍵碼。
在上圖的b-樹上查詢關鍵字47的過程如下:
1)首先從更開始,根據根節點指標找到 *a節點,因為 *a 節點中只有乙個關鍵字,且給定值47 > 關鍵字35,則若存在必在指標a1所指的子樹內。
2)順指標找到 *c節點,該節點有兩個關鍵字(43和 78),而43 < 47 < 78,若存在比在指標a1所指的子樹中。
3)同樣,順指標找到 *g節點,在該節點找到關鍵字47,查詢成功。
二:b+樹是應檔案系統所需而產生的一種b-樹的變形樹。
一棵m階的b+樹和m階的b-樹的差異在於:
⑴有n 棵子樹的結點中含有n 個關鍵碼;
⑵所有的葉子結點中包含了全部關鍵碼的資訊,及指向含有這些關鍵碼記錄的指標,且葉子結點本身依關鍵碼的大小自小而大組成順序鍊錶。
⑶在b+樹上進行隨機查詢、插入和刪除的過程基本上與b-樹類似。只是在查詢時,若非葉結點上的關鍵碼等於給定值,也並不終止,而是繼續向下直到葉子結點。因此,在b+樹中,不管查詢成功與否,每次查詢都是走了一條從根節點到葉子結點的路徑。
如圖一棵3階的b+樹:通常在b+樹上有兩個頭指標,乙個指向根節點,另乙個指向關鍵字最小的葉子節點。因此可以對b+樹進行兩種查詢運算:一種是從最小關鍵字起順序查詢,另一種是從根節點開始,進行隨機查詢。
三:下面來介紹b+樹在資料庫索引中的典型應用。
資料庫索引常用b+樹來實現。資料庫索引分為聚集索引(也叫聚簇索引)和非聚集索引(非聚簇索引)兩種型別。
innodb引擎使用的是聚集索引。所謂聚集索引:就是b+樹的葉子節點的data域中存放的是完整的資料記錄。
對於聚集索引,按照b+樹中關鍵字的不同分為主鍵索引和輔助索引。使用主鍵屬性作為b+樹的關鍵字就是主鍵索引,使用非主鍵屬性作為b+樹的關鍵字就是輔助索引。如下圖:
上圖是innodb主鍵索引
上圖是innodb輔助索引
聚集索引這種實現方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。從上面的資料結構也可以理解,用來做索引的屬性列的字段越短效能越好。
上圖是myisam主鍵索引
上圖是myisam輔助索引
innodb索引和myisam索引的區別:
1) innodb是聚集索引,b+樹的葉子節點的data域中儲存的是完整的資料記錄。myisam是非聚集索引,b+樹的葉子節點的data域中儲存的是資料記錄的位址。
2) innodb的輔助索引中,b+樹的葉子節點的data域中儲存的是對應的主鍵,因此在innodb中使用輔助索引需要兩邊檢索。而對於myisam索引,無論是主鍵索引還是輔助索引對需要一次檢索即可。
3) 對於聚集索引,因為它的主鍵索引的data域中儲存的是完整的行資訊,因此不會再單獨儲存行資訊,這也是它的輔助索引的data域中儲存的是主鍵值的原因。對於非聚集索引,它的主鍵索引和輔助索引的data域中儲存的都是行資訊的位址,因此需要單獨的空間來儲存行資訊。如下圖:
b-tree索引適用於全鍵值,鍵值或字首查詢。其中鍵字首查詢只適用於根據最字首的查詢。前面所述的索引對如下型別的查詢有效:
1. 全值匹配:全值匹配指的是和索引中的所有列進行匹配。
2. 匹配最左字首:即僅僅匹配索引的最左側列。
3. 匹配最左字首的一部分:即僅僅匹配索引的最左側列的一部分。
4. 匹配範圍值:指定索引的最左側列的範圍。
5. 精確匹配前幾列並範圍匹配後一列
將上面的敘述總結起來,可以歸納出b-tree索引的限制:
1. 如果不是按照索引的最左列開始查詢,則無法使用索引。
2. 查詢時不能跳過索引中的列。
3. 如果查詢中有某個列的範圍查詢,則其右邊所有的列都無法使用索引優化查詢。
讀者應該明白,索引列的順序是很重要的,在效能優化的時候,可以建立相同的列但順序不同的索引來滿足不同的需求。
資料庫索引 B樹索引
b樹索引能自動的保持和資料檔案大小相適應的索引層次。通過對所使用的儲存塊空間進行管理,使每個塊的充滿程度在半滿和全滿之間。這樣的索引不再需要溢位塊。b 樹的資料結構 通常b樹有三層 跟 中間層和葉。葉子節點是乙個塊,它儲存了n個 鍵值,資料記錄指標 對,外加乙個指向下乙個兄弟葉子節點的指標。葉子節點...
資料庫索引 B 樹
目錄特點 例項 查詢 插入 刪除 總結b 樹是b樹的變種,查詢效率比b更高。為什麼更高?往下看。參考 1.有k個子樹的中間節點包含有k個元素 b樹中是k 1個元素 每個元素不儲存資料,只用來索引,所有資料 都儲存在葉子節點。2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子...
資料庫索引(B樹,B 樹,雜湊)
一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一索引 不允許其中任何兩行具有相同值的索引 使用主鍵和候選鍵建立的索引就...