MYSQL之B+TREE索引原理


1.什么是索引?

索引:加速查詢的數據結構。

2.索引常見數據結構

  • 順序查找: 最基本的查詢算法-復雜度O(n),大數據量此算法效率糟糕。
  • 二叉樹查找:(binary tree search): O(log2n) ,二叉查找樹根節點固定,非平衡。樹高度深,高度決定io次數,io耗時大。
  • hash索引 無法滿足范圍查找。
  • 二叉樹、紅黑樹 :導致樹高度非常高(平衡二叉樹一個節點只能有左子樹和右子樹),邏輯上很近的節點(父子)物理上可能很遠,無法利用局部性,IO次數多查找慢,效率低。todo 邏輯上相鄰節點沒法直接通過順序指針關聯,可能需要迭代回到上層節點重復向下遍歷找到對應節點,效率低。
  • B-Tree:結構:B-TREE 每個節點都是一個二元數組: [key, data],所有節點都可以存儲數據。key為索引key,data為除key之外的數據。

        檢索原理:首先從根節點進行二分查找,如果找到則返回對應節點的data,否則對相應區間的指針指向的節點遞歸進行查找,直到找到節點或未找到節點返回null指針。

        缺點:1.插入刪除新的數據記錄會破壞B-Tree的性質,因此在插入刪除時,需要對樹進行一個分裂、合並、轉移等操作以保持B-Tree性質。造成IO操作頻繁。2.區間查找可能需要返回上層節點重復遍歷,IO操作繁瑣。

  • B+Tree:B-Tree的變種,與B-Tree相比,B+Tree有以下不同點:非葉子節點不存儲data,只存儲索引key;只有葉子節點才存儲data。

    Mysql中B+Tree:在經典B+Tree的基礎上進行了優化,增加了順序訪問指針。在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,就形成了帶有順序訪問指針的B+Tree。這樣就提高了區間訪問性能:如果要查詢key為從18到49的所有數據記錄,當找到18后,只需順着節點和指針順序遍歷就可以一次性訪問到所有數據節點,極大提到了區間查詢效率(無需返回上層父節點重復遍歷查找減少IO操作)。

結構如下:

3.為什么Mysql選擇B+TREE索引? B+TREE索引有什么好處?

    索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產生磁盤I/O消耗,相對於內存存取,I/O存取的消耗要高幾個數量級,所以索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數,提升索引效率。

磁盤存取原理:

    索引一般以文件形式存儲在磁盤上,索引檢索需要磁盤I/O操作。與主存不同,磁盤I/O存在機械運動耗費,因此磁盤I/O的時間消耗是巨大的。

4.B-/+Tree索引的性能優勢: 一般使用磁盤I/O次數評價索引優劣。

  • 1.結合操作系統存儲結構優化處理: mysql巧妙運用操作系統存儲結構(一個節點分配到一個存儲頁中->盡量減少IO次數) & 磁盤預讀(緩存預讀->加速預讀馬上要用到的數據).
  • 2.B+Tree 單個節點能放多個子節點,相同IO次數,檢索出更多信息。
  • 3.B+TREE 只在葉子節點存儲數據 & 所有葉子結點包含一個鏈指針 & 其他內層非葉子節點只存儲索引數據。只利用索引快速定位數據索引范圍,先定位索引再通過索引高效快速定位數據。
  • B-Tree索引、B+Tree索引: 單個節點能放多個子節點,查詢IO次數相同(mysql查詢IO次數最多3-5次-所以需要每個節點需要存儲很多數據)
  • B+TREE 只在葉子節點存儲數據 & 所有葉子結點包含一個鏈指針 & 其他內層非葉子節點只存儲索引數據。只利用索引快速定位數據索引范圍,先定位索引再通過索引高效快速定位數據。
  • B+Tree更適合外存索引,原因和內節點出度d有關。從上面分析可以看到,d越大索引的性能越好,而出度的上限取決於節點內key和data的大小:
  • B+Tree內節點去掉了data域,因此可以擁有更大的出度,擁有更好的性能。只利用索引快速定位數據索引范圍,先定位索引再通過索引高效快速定位數據。

5.B+樹(平衡多路查找樹)

  B+樹是為了磁盤或其它直接存取設備設計的一種平衡多路查找樹。在B+樹里是,所以記錄節點都是鍵值的大小順序存放在同一層的葉子節點上,由各葉子節點指針進行連接。

  B+樹索引在數據庫中有高扇出性的特點,因此在數據庫中,B+樹的高度一般在2~4層,也就是說查找某一鍵值的行記錄時最多只需要2~4次IO.

  數據庫中的B+樹索引可以分為聚集索引和輔助索引,其內部都是B+樹的,高度平衡,葉子節點存放着數據。

  聚集索引和輔助索引不同的是,葉子節點存放的是否是一整行的信息。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM