MySQL中的索引結構B-Tree和B+Tree

前言

今天重點說一下B-Tree索引。文中的大部分圖都是盜取來的。

正文

首先簡單的介紹一下什麼是B-Tree:
一種適用於外查找的樹,一種平衡的多叉樹並且具有以下的特點:
(一顆根節點最大爲m個關鍵字的樹)
1、樹中每個節點最多有m個孩子;
2、除去根節點和葉子節點外,其他每個節點最少有m/2個孩子;
3、如果根節點不是葉子節點,則至少有2個孩子;
4、所有葉子節點都出現在同一層,葉子節點不包含任何關鍵字信息;
5、所有非終端節點中包含有信息(P0,K0,P1,K1,P3,…,Ki,P(i+1)),其中:Ki(i=0,1,2,…,m)爲關鍵字,且Ki<K(i+1),Pi(i=0,1,2,…m+1)爲指向根節點的指針,m爲關鍵字的個數。
6、非葉子節點的指針:P0,P1,P2,…,Pm;其中P0指向關鍵字小於K0的子樹,P(m+1)指向大於Km的子樹,其他Pi指向關鍵字屬於(Ki,K(i+1))的子樹。
如圖所示:
在這裏插入圖片描述
B-Tree的特性:
1、關鍵字集合分佈在整棵樹中;
2、任何一個關鍵字出現且只出現在一個節點中;
3、搜索有可能在非葉子節點結束;
4、其搜索性能等價與在關鍵字全集內做一次二分查找;
5、自動層次控制;

大家可以參考這個動圖,圖中說的是B-Tree的插入過程:
在這裏插入圖片描述

B+Tree是在B-Tree的基礎上發展來的。
差異:
1、有m個子節點必然有m個關鍵碼;
2、非葉子節點僅具有索引作用,跟記錄有關的信息均存放在葉子節點中;
3、樹的所有葉節點構成一個有序鏈表,可以按照關鍵碼排序的次序遍歷全部記錄。
如圖所示:
在這裏插入圖片描述
下邊的圖是B+Tree的插入動圖:
在這裏插入圖片描述
通過上邊的簡單介紹應該對兩種類型的樹有了認識。Mysql中使用的是哪種結構呢?通過查詢各種資料然後彙總如下:
比B樹更適合作爲索引的結構是B+樹。MySQL中也是使用B+樹作爲索引。
B樹:有序數組+平衡多叉樹;
B+樹:有序數組鏈表+平衡多叉樹;
B+樹的關鍵字全部存放在葉子節點中,非葉子節點用來做索引,而葉子節點中有一個指針指向一下個葉子節點。做這個優化的目的是爲了提高區間訪問的性能。而正是這個特性決定了B+樹更適合用來存儲外部數據。
數據庫索引採用B+樹的主要原因是B樹在提高了磁盤IO性能的同時並沒有解決元素遍歷的效率低下的問題。正是爲了解決這個問題,B+樹應運而生。B+樹只要遍歷葉子節點就可以實現整棵樹的遍歷。而且在數據庫中基於範圍的查詢是非常頻繁的,而B樹不支持這樣的操作(或者說效率太低)。
正如上面所說, 在數據庫中基於範圍的查詢是非常頻繁的,因此MySQL最終選擇的索引結構是B+樹而不是B樹(這句話可能不是很嚴謹)

結束

其實在MySQL中不同存儲引擎對索引的實現方式是不同的,MyISAM和InnoDB兩個存儲引擎的索引實現方式。
1、MyISAM引擎使用B+Tree作爲索引結構
2、雖然InnoDB也使用B+Tree作爲索引結構,但具體實現方式卻與MyISAM截然不同。(詳細的內容可以搜索:MySQL索引背後的數據結構及算法原理)

動圖引用的csdn博客:淺談算法和數據結構: 十 平衡查找樹之B樹
還有一篇寫的比較詳細的博客:BTree和B+Tree詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章