標籤:
Mysql索引實現:
B-tree,B是balance,一般用於資料庫的索引。使用B-tree結構可以顯著減少定位記錄時所經曆的中間過程,從而加快存取速度。而B+tree是B-tree的一個變種,MySQL就普遍使用B+tree實現其索引結構。
一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引尋找過程中就要產生磁碟I/O消耗,相對於記憶體存取,I/O存取的消耗要高几個數量級,所以評價一個資料結構作為索引的優劣最重要的指標就是在尋找過程中磁碟I/O操作次數的漸進複雜度。換句話說,索引的結構組織要盡量減少尋找過程中磁碟I/O的存取次數。
為了達到這個目的,磁碟按需讀取,要求每次都會預讀的長度一般為頁的整數倍。而且資料庫系統將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入。每次建立節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也儲存在一個頁裡,加之電腦儲存分配都是按頁對齊的,就實現了一個node只需一次I/O。並把B-tree中的m值設的非常大,就會讓樹的高度降低,有利於一次完全載入
B-Way尋找樹:
一棵樹的每個節點的度小於等於m。
每個節點的索引值數小於m每個節點的度小於等於m索引值按順序排列子樹的索引值要完全小於或大於或介於父節點之間的索引值
B-Tree樹:
B-tree又叫平衡多路尋找樹。一棵m階的B-tree (m叉樹)的特性如下:
(其中ceil(x)是一個取上限的函數)
1) 樹中每個結點至多有m個孩子;
2) 除根結點和葉子結點外,其它每個結點至少有有ceil(m / 2)個孩子;
3) 若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有一個根節點);
4) 所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字資訊(可以看做是外部結點或查詢失敗的結點,實際上這些結點不存在,指向這些結點的指標都為null);
5) 每個非終端結點中包含有n個關鍵字資訊: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
a) Ki (i=1...n)為關鍵字,且關鍵字按順序排序K(i-1)< Ki。
b) Pi為指向子樹根的接點,且指標P(i-1)指向子樹種所有結點的關鍵字均小於Ki,但都大於K(i-1)。
c) 關鍵字的個數n必須滿足: ceil(m / 2)-1 <= n <= m-1。
B+Tree樹:
B+樹是B-樹的變體。
有幾點不同的地方:
- 非葉子結點的子樹指標與關鍵字個數相同
- 為所有葉子結點增加一個鏈指標
- 所有關鍵字都在葉子結點出現
二、叢集索引, 非叢集索引
叢集索引:
該索引中索引值的邏輯順序決定了表中相應行的物理順序。
叢集索引確定表中資料的物理順序。叢集索引類似於電話簿,後者按姓氏排列資料。由於叢集索引規定資料在表中的實體儲存體順序,因此一個表只能包含一個叢集索引。但該索引可以包含多個列(複合式索引),就像電話簿按姓氏和名字進行組織一樣。
非叢集索引:
該索引中索引的邏輯順序與磁碟上行的實體儲存體順序不同。
索引是通過二叉樹的資料結構來描述的,我們可以這麼理解聚簇索引:索引的分葉節點就是資料節點。而非聚簇索引的分葉節點仍然是索引節點,只不過有一個指標指向對應的資料區塊。如:
Mysql 索引實現原理. 叢集索引, 非叢集索引