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