索引是關聯式資料庫中對某一列或多個列的值進行預排序的資料結構,就好比書籍的目錄。
索引的出現其實就是為了提高資料庫查詢的效率,就好比書的目錄,通過書的目錄,我們可以快速精確找到我們想要的資訊
索引的作用是為了提高查詢的效率,而可以提高查詢的資料結構有很多種,我們都知道資料庫選擇了b+樹這一資料模型作為索引的資料結構,那麼為什麼選擇b+樹,而不是其他資料結構?
如果單從查詢效率來看,陣列顯然是最合適的,我們都知道陣列的查詢速度快,但是當我們的資料庫中存在資料更新時,假如在中間插入乙個資料,那麼後面的全部資料都要移動,顯然陣列結構比較適合靜態資料不變的儲存
由二分查詢思想,二叉樹也是經典的提高查詢速度的資料結構,但是為什麼不選擇二叉樹是因為,索引的儲存位置原因,這裡首先問一下,索引儲存在**?
索引儲存在磁碟當中,首先要知道索引要載入到記憶體中才能查詢,而從磁碟到記憶體的載入過程就會有磁碟i/o過程,資料查詢的主要時間就是磁碟i/o的時間,我們簡單理解就是i/o過程非常消耗時間,我們需要做的就是儘量減少i/o的過程,這裡我們舉個例子。假設乙個7個節點的二叉樹它可以是三層高,也同樣可以是7層高,二叉樹高度不好控不行,那麼平衡二叉樹那,我們認為的新增限定條件,限制樹的高度,但是假如n比較大二叉樹依然很高,所以我們換一種思路m叉樹,也就是b樹和b+樹
b-樹是一種平衡的多路查詢樹。b樹結構如下圖所示
b樹每個結點最多有m棵子樹,m就是b樹的階,一棵m階的b樹滿足下面的特性:
樹中每個節點最多有m棵子樹
若根節點不是葉子結點,則最少有兩棵子樹
除根節點外的所有非終端結點,也就是中間結點,子樹在[ceil(m/2),m]之間,就是有最大最小值約束
所有非終端結點(葉子結點)也就是中間結點,包含三種資訊(關鍵字,子樹,指標),假設乙個中間結點,包含k個關鍵字,則子樹數目為k+1,也就是說關鍵字和子樹數目存在加一的關係
假設中間節點節點的關鍵字為:key[1], key[2], …, key[k-1],且關鍵字按照公升序排序,即 key[i]所有葉子結點出現在同乙個層次
b+樹是基於b-樹做的改進,兩者差異在於:
有 k 個孩子的節點就有 k 個關鍵字。也就是孩子數量 = 關鍵字數,而 b 樹中,孩子數量 = 關鍵字數 +1。
非葉子節點的關鍵字也會同時存在在子節點中,並且是在子節點中所有關鍵字的最大(或最小)。
非葉子節點僅用於索引,不儲存資料記錄,跟記錄有關的資訊都放在葉子節點中。而b樹中,非葉子節點既儲存索引,也儲存資料記錄。
mysql 為什麼用B 樹做索引
平衡二叉樹,2 3 4樹,紅黑樹都是平衡的,為什麼不能用來做innodb的索引呢?索引是存在於索引檔案中,是存在於磁碟中的,索引通常是很大的,因此無法一次將全部索引載入到記憶體當中,每次只能從磁碟中讀取乙個磁碟頁的資料到記憶體中,磁碟的讀取速度較記憶體中的讀取速度而言是差了好幾個級別的 邏輯結構上相...
mysql為什麼用b 樹做索引
關鍵字就是key的意思 1 定義任意非葉子結點最多只有m個兒子,且m 2 2 根結點的兒子數為 2,m 3 除根結點以外的非葉子結點的兒子數為 m 2,m 4 每個結點存放至少m 2 1 取上整 和至多m 1個關鍵字 至少2個關鍵字 5 非葉子結點的關鍵字個數 指向兒子的指標個數 1 6 非葉子結點...
為什麼Mysql用B 樹做索引而不用B 樹
先從資料結構的角度來答。題主應該知道b 樹和b 樹最重要的乙個區別就是b 樹只有葉節點存放資料,其餘節點用來索引,而b 樹是每個索引節點都會有data域。這就決定了b 樹更適合用來儲存外部資料,也就是所謂的磁碟資料。從mysql inoodb 的角度來看,b 樹是用來充當索引的,一般來說索引非常大,...