B 樹在mysql資料庫索引中的使用

2022-08-21 08:27:10 字數 2367 閱讀 1392

一: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 樹,雜湊)

一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一索引 不允許其中任何兩行具有相同值的索引 使用主鍵和候選鍵建立的索引就...