B-Tree和B+Tree的比較,你了解了么?
我們都知道在 Mysql 中,索引是非常重要的內容,因為他對我們的查詢會有非常大的幫助,所以,我們今天就來看看這個 Mysql 的索引。
Mysql 索引
B-Tree索引:
- 這是MySQL中最常用的索引類型,基于B-Tree(平衡樹)數據結構。
- InnoDB、MyISAM、Memory存儲引擎都使用B-Tree索引。
- B-Tree索引能夠處理全值匹配和范圍查詢,并且能夠按照索引列的順序進行排序。
B+Tree是一種自平衡的樹結構,它維護了排序數據的索引。與二叉樹不同,B+Tree的每個節點可以有多個子節點(這個數量通常稱為“階”或“度”)。樹中的每個節點都存儲了鍵和指向子節點的指針。但與B-Tree不同的是,B+Tree的非葉子節點不存儲數據,只存儲鍵和指針,而所有的數據都存儲在葉子節點中。此外,B+Tree的葉子節點之間通過指針鏈接,這樣可以方便地進行范圍查詢。
哈希索引
- 主要用于MEMORY存儲引擎。
- 基于哈希算法,只支持等值查詢,不支持范圍查詢。
- 查詢速度非???,但不適合有排序需求或范圍查詢的場景。
空間索引(SPATIAL)
- 用于處理空間數據,如點、線和多邊形等。
- 基于R-Tree數據結構,用于地理空間數據類型的字段。
- 主要在MyISAM存儲引擎中使用,但從MySQL 5.7開始,InnoDB也開始支持空間索引。
對于空間數據類型(如點、線和多邊形),MySQL提供了空間索引來支持高效的空間查詢??臻g索引基于R-Tree數據結構實現,可以快速地定位到滿足查詢條件的空間對象??臻g索引在GIS(地理信息系統)和LBS(基于位置的服務)等應用中非常有用。然而需要注意的是,空間索引只在MyISAM存儲引擎中直接支持;在InnoDB中則需要使用額外的擴展或技巧來實現類似的功能。但從MySQL 8.0開始,InnoDB也開始支持空間索引了。
全文索引(FULLTEXT)
- 主要用于MyISAM存儲引擎(盡管從MySQL 5.6開始InnoDB也支持全文索引)。
- 用于在文本列上進行全文搜索,支持自然語言查詢、布爾查詢和查詢擴展。
- 全文索引在創建時會創建一個包含所有單詞的索引,查詢時能夠快速找到包含特定單詞的行。
聚簇索引與非聚簇索引
- 這不是一種單獨的索引類型,而是描述索引與數據行之間關系的術語。
- 在InnoDB中,表總是有一個聚簇索引(通常是主鍵索引),數據行實際上存儲在聚簇索引的葉子節點中。
- 非聚簇索引(二級索引)的葉子節點存儲的是指向數據行的指針或主鍵值。
復合索引:
- 由多個列組成的索引。
- 可以提高多個列上的查詢性能,但需要注意索引列的順序和查詢條件的使用方式。
- 復合索引遵循最左前綴原則,即查詢條件需要包含索引的最左邊的列才能有效利用索引。
唯一索引:
- 確保索引列中的所有值都是唯一的。
- 可以在一個或多個列上創建唯一索引。
- 主鍵索引是一種特殊的唯一索引,它不僅要求值是唯一的,還要求每個值都不能為NULL。
我們說完了這個索引的分類之后,我們就來看看經典的 Mysql 默認的 InnoDB 引擎的所使用的 B+Tree索引
B+Tree索引
B+Tree索引是數據庫中最常用的索引類型之一,特別是在像MySQL這樣的關系型數據庫中。B+Tree(B-Plus Tree)是B-Tree的一種變種,它提供了更高的查詢性能,特別是在處理大量數據和進行范圍查詢時。
MySQL數據庫索引采用的是B+Tree結構,在B-Tree結構上做了優化改造。B-Tree結構:
索引值和data數據分布在整棵樹結構中
每個節點可以存放多個索引值及對應的data數據
樹節點中的多個索引值從左到右升序排列
圖片
B-Tree(平衡樹)的搜索過程
B-Tree(平衡樹)的搜索過程是一個相對直觀且高效的操作,它利用了樹的結構特性來快速定位到需要查找的數據。以下是B-Tree搜索的基本步驟:
1.從根節點開始:搜索操作總是從B-Tree的根節點開始。
2.比較關鍵字:在當前節點內,從左到右順序比較關鍵字。找到第一個大于或等于目標關鍵字的關鍵字項,或者找到當前節點中的最大關鍵字項(如果所有關鍵字項都小于目標關鍵字)。
3.決定搜索方向:
- 如果找到的關鍵字項等于目標關鍵字,則搜索成功,返回該關鍵字項所在的節點和位置。
- 如果找到的關鍵字項大于目標關鍵字,并且當前節點是葉子節點,則搜索失敗,目標關鍵字不存在于樹中。
- 如果找到的關鍵字項大于目標關鍵字,但當前節點不是葉子節點,則在當前節點的子節點中繼續搜索。選擇找到的關鍵字項左側的子節點作為下一步搜索的起點(因為B-Tree的性質保證了左側子樹中的所有關鍵字都小于當前節點的這個關鍵字項)。
- 如果所有關鍵字項都小于目標關鍵字,并且當前節點不是葉子節點,則在右側子節點中繼續搜索(同理,右側子樹中的所有關鍵字都大于當前節點的最大關鍵字項)。
4.遞歸搜索:重復步驟2和3,直到找到目標關鍵字或確定關鍵字不存在于樹中。
5.處理葉子節點:當搜索到達葉子節點時,如果葉子節點中包含目標關鍵字,則返回該節點和關鍵字的位置;否則,搜索失敗。
B+Tree的結構
B+Tree(B-Plus Tree)是一種自平衡的多路搜索樹,廣泛應用于數據庫和文件系統的索引結構。它是B-Tree的一種擴展,具有一些獨特的性質和優化,使得它在某些場景下比B-Tree更加高效。
圖片
B+Tree的搜索過程與B-Tree類似,但由于B+Tree的數據只存儲在葉子節點,并且葉子節點之間通過指針相連,所以搜索過程有一些不同。以下是B+Tree搜索的基本步驟:
1.從根節點開始:搜索總是從B+Tree的根節點開始。
2.在內部節點中搜索:在每個內部節點(非葉子節點)中,從左到右順序比較關鍵字。找到第一個大于或等于目標關鍵字的關鍵字項,然后轉到與之關聯的子節點。如果沒有找到大于或等于目標關鍵字的關鍵字項,則轉到當前節點中最大關鍵字項右側的子節點(如果存在的話)。
3.遞歸下降:重復步驟2,直到到達一個葉子節點。
4.在葉子節點中搜索:在葉子節點內順序搜索目標關鍵字。如果找到匹配項,則返回該匹配項及其對應的數據記錄(或指向數據記錄的指針)。如果沒有找到匹配項,但葉子節點中存在相鄰的節點指針,并且搜索是范圍查詢的一部分,則可以使用這些指針繼續搜索。
5.處理范圍查詢:如果搜索是范圍查詢(例如,查找所有大于某個值的數據項),則在找到第一個匹配項后,可以沿著葉子節點間的鏈表繼續搜索,直到找到范圍外的第一個數據項為止。
6.結束搜索:如果遍歷完所有可能的路徑仍然沒有找到目標關鍵字,則搜索失敗,表示該關鍵字不存在于B+Tree中。
B-Tree和B+Tree的比較
B-Tree和B+Tree在多個方面存在顯著的比較差異,這些差異主要體現在它們的結構、查詢性能、磁盤I/O操作以及應用場景上。
1.結構
B-Tree:每個節點既包含關鍵字信息也包含數據信息,并且每個節點都可以作為查找的終點,即數據可以出現在內部節點或葉子節點。
B+Tree:非葉子節點只存儲關鍵字信息(不存儲數據信息),且關鍵字起到索引的作用,指向子節點。真正的數據只出現在葉子節點,且葉子節點之間通過指針相連,形成一個有序的鏈表結構。
2.查詢性能
B-Tree:查詢性能不穩定,因為數據可能出現在內部節點或葉子節點。查找速度取決于目標數據距離根節點的距離。
B+Tree:由于所有數據都存儲在葉子節點,所以查詢性能相對穩定。每次查找都需要到達葉子節點,但由于內部節點不存儲數據,每個節點可以存儲更多的關鍵字,從而樹的高度相對較低,減少了查找所需的磁盤I/O次數。
3.磁盤I/O操作
B-Tree:由于數據可能分布在樹的各個層級,因此可能需要進行多次磁盤I/O操作才能找到目標數據。
B+Tree:由于數據只存儲在葉子節點,且葉子節點之間通過指針相連,因此在進行范圍查詢時,一旦找到范圍的起始點,就可以沿著葉子節點鏈表進行順序訪問,無需進行多次磁盤I/O操作。
4.應用場景
B-Tree:適用于需要同時訪問內部節點和葉子節點數據的場景,但這種情況在實際應用中較為少見。
B+Tree:由于其高效的磁盤I/O性能和出色的范圍查詢能力,B+Tree被廣泛應用于數據庫和文件系統的索引結構,特別是當數據存儲在磁盤等輔助存儲設備上時。
所以你了解了么?