為什么Mysql用B+樹做索引而不用B-樹或紅黑樹


B+樹做索引而不用B-樹

  • 那么Mysql如何衡量查詢效率呢?– 磁盤IO次數。
  • 一般來說索引非常大,尤其是關系性數據庫這種數據量大的索引能達到億級別,所以為了減少內存的占用,索引也會被存儲在磁盤上。

B-樹/B+樹的特點就是每層節點數目非常多,層數很少,目的就是為了減少磁盤IO次數,但是B-樹的每個節點都有data域(指針),這無疑增大了節點大小,說白了增加了磁盤IO次數(磁盤IO一次讀出的數據量大小是固定的,單個數據變大,每次讀出的就少,IO次數增多,一次IO多耗時), 而B+樹除了葉子節點其它節點並不存儲數據,節點小,磁盤IO次數就少。

B+樹的優點

優點一: B+樹的磁盤讀寫代價更低:B+樹只有葉節點存放數據,其余節點用來索引,而B-樹是每個索引節點都會有Data域。

優點二: B+樹帶有順序訪問指針:B+樹所有的Data域在葉子節點,並且所有葉子節點之間都有一個鏈指針。 這樣遍歷葉子節點就能獲得全部數據,這樣就能進行區間訪問啦。在數據庫中基於范圍的查詢是非常頻繁的,而B樹不支持這樣的遍歷操作。

優點三:B+樹的查詢效率更加穩定:由於非葉子節點並不是最終指向文件內容的節點,而只是葉子節點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。而B樹因為非葉子節點也存在數據Data域,有可能在非葉子節點中就可獲取數據並返回。

B+數帶有順序訪問指針的優點

一般在數據庫系統或文件系統中使用的B+Tree結構都在經典B+Tree的基礎上進行了優化,增加了順序訪問指針。在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,就形成了帶有順序訪問指針的B+Tree。做這個優化的目的是為了提高區間訪問的性能,例如如果要查詢key為從15到60的所有數據記錄,當找到15后,只需順着節點和指針順序遍歷就可以一次性訪問到所有數據節點,極大提到了區間查詢效率。

B樹的優點

對於在內部節點的數據,可直接得到,不必根據葉子節點來定位

B+樹做索引而不用紅黑樹

AVL 樹(平衡二叉樹)和紅黑樹(二叉查找樹)基本都是存儲在內存中才會使用的數據結構。

在大規模數據存儲的時候,紅黑樹往往出現由於樹的深度過大而造成磁盤IO讀寫過於頻繁,進而導致效率低下的情況。

為什么會出現這樣的情況?

磁盤讀寫IO跟樹的深度有關系,磁盤一次IO讀取的數據多能做的事也將更多。(我們知道要獲取磁盤上數據,必須先通過磁盤移動臂移動到數據所在的柱面,然后找到指定盤面,接着旋轉盤面找到數據所在的磁道,最后對數據進行讀寫。磁盤IO代價主要花費在查找所需的柱面上,樹的深度過大會造成磁盤IO頻繁讀寫。)根據磁盤查找存取的次數往往由樹的高度所決定,所以,只要我們通過某種較好的樹結構減少樹的結構盡量減少樹的高度,B樹可以有多個子女,從幾十到上千,但是降低樹的高度。

數據庫設計者選擇

數據庫系統的設計者巧妙利用了磁盤預讀原理,將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入。為了達到這個目的,在實際實現B-Tree還需要使用如下技巧:每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁里,加之計算機存儲分配都是按頁對齊的,就實現了一個node只需一次I/O。

B-Tree有許多變種,其中最常見的是B+Tree,例如MySQL就普遍使用B+Tree實現其索引結構。

磁盤和內存選擇B樹和紅黑樹的原因

B樹優點
  1. B+樹的高度要比紅黑樹小,有效減少了磁盤的隨機訪問
  2. B+樹的數據節點相互臨近,能夠發揮磁盤順序讀取的優勢(緩存)
  3. B+樹的數據全部存於葉子結點,而其他節點產生的浪費在經濟負擔上能夠接收,紅黑樹存儲浪費小
紅黑樹優點
  1. 紅黑樹常用於存儲內存中的有序數據,增刪很快,B+樹常用於文件系統和數據庫索引,因為B樹的子節點大於紅黑樹,紅黑樹只能有2個子節點,B樹子節點大於2,子節點樹多這一特點保證了存儲相同大小的數據,樹的高度更小,數據局部更加緊湊,而硬盤讀取有局部加載的優化(緊湊的好處:把要讀取數據和周圍的數據一起預先讀取),B樹相鄰數據物理上更加緊湊這一特點符合硬盤進行io優化的特性。
  2. B+樹在B樹基礎上進一步將數據只存在葉子節點,非葉子節點不存值只存儲值的指向,這使得單個節點能有更多子節點,除此之外將所有葉子節點(值存在葉子節點)放入鏈表中,使得數據更加緊湊有序,只需要鏈表(葉子節點)的一次遍歷就能獲取所有樹上的值。

B+樹這些特性適合用於數據庫的索引,mysql底層數據結構就是B+樹。

B樹更適用於磁盤讀取,紅黑樹更適用於內存讀取


免責聲明!

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



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