最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL底層數(shù)據(jù)結(jié)構(gòu)選用B+樹(shù)的原因

 更新時(shí)間:2021年12月15日 10:23:33   作者:雨簦  
大家好,本篇文章主要講的是MySQL底層數(shù)據(jù)結(jié)構(gòu)選用B+樹(shù)的原因,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

? ? ? ?我們都知道MySQL底層數(shù)據(jù)結(jié)構(gòu)是選用的B+樹(shù),那為什么不用紅黑樹(shù),或者其他什么數(shù)據(jù)結(jié)構(gòu)呢?

????????紅黑樹(shù)是一種自平衡二叉查找樹(shù),Java8中的hashmap就用到紅黑樹(shù)來(lái)優(yōu)化它的查詢效率,可見(jiàn),紅黑樹(shù)的查詢效率還是比較高的,但是為什么MySQL的底層不用紅黑樹(shù)而用B+數(shù)呢?

????????下圖是紅黑樹(shù)依次插入1,2,3,4,5,6之后的情況:

?然后再在上面的紅黑樹(shù)中插入7:

???????可以看到,盡管紅黑樹(shù)經(jīng)過(guò)了自平衡,數(shù)據(jù)整體仍然偏向樹(shù)的右側(cè),如果繼續(xù)添加更多數(shù)據(jù),添加的數(shù)據(jù)上百萬(wàn)、千萬(wàn)之后,樹(shù)的層級(jí)將會(huì)非常高,查詢時(shí)每多經(jīng)過(guò)一層,就會(huì)多進(jìn)行一次io,樹(shù)的層級(jí)多了之后查找效率就會(huì)很慢。這個(gè)時(shí)候可能就會(huì)有人問(wèn)了,那為什么不用平衡性更好的AVL樹(shù)呢?

????????AVL樹(shù)在一次插入1,2,3,4,5,6,7之后是這樣的:

? ? ? ? ?的確變順眼了很多,樹(shù)的層數(shù)也變少了,可AVL仍然沒(méi)有解決根本問(wèn)題,當(dāng)數(shù)據(jù)量達(dá)到百萬(wàn)、千萬(wàn)之后,樹(shù)的層數(shù)仍然會(huì)比較大,先不說(shuō)AVL樹(shù)維護(hù)平衡所需的代價(jià),單論AVL樹(shù)的層數(shù)就無(wú)法達(dá)到我們的要求。

? ? ? ? 那么什么樣的數(shù)據(jù)結(jié)構(gòu)可以讓數(shù)據(jù)量達(dá)到百萬(wàn),千萬(wàn),甚至更大的體量時(shí),層數(shù)仍然很小呢?很顯然,想要減少層數(shù),就必須要讓每層儲(chǔ)存的數(shù)據(jù)數(shù)更多,二叉樹(shù)不管平衡性再好也只能做到每個(gè)節(jié)點(diǎn)有兩個(gè)分叉,每層的數(shù)據(jù)量從數(shù)據(jù)結(jié)構(gòu)被限制住了,那么,我們就不能從二叉樹(shù)中選。所以這個(gè)時(shí)候B樹(shù)的優(yōu)勢(shì)就體現(xiàn)出來(lái)了,B樹(shù)每個(gè)節(jié)點(diǎn)可以存儲(chǔ)多個(gè)元素,每個(gè)元素之間可以都可以擁有一個(gè)分叉,下圖是B樹(shù)每個(gè)節(jié)點(diǎn)最多可以存儲(chǔ)3個(gè)元素的情況:

?????????可以看到樹(shù)的層級(jí)減小到兩層,如果說(shuō)每次每個(gè)節(jié)點(diǎn)最多可以存儲(chǔ)的元素個(gè)數(shù)足夠大,那么就算數(shù)據(jù)量達(dá)到上千萬(wàn)的量級(jí),也可以將樹(shù)的層級(jí)控制在一個(gè)可以接受的范圍內(nèi)。

????????但B樹(shù)還有一個(gè)問(wèn)題,下圖展示的是B樹(shù)層級(jí)達(dá)到三層時(shí)的情況:

?????????如果現(xiàn)在我需要取出5-10號(hào)元素,當(dāng)我通過(guò)層層查詢,找到5號(hào)元素,然后發(fā)現(xiàn)其他元素不在這個(gè)節(jié)點(diǎn),還需要通過(guò)局部中序遍歷查詢其他元素,找到7之后還需如此操作找到8,9,10,這又會(huì)增加io次數(shù),所以也就有了B+樹(shù)。

? ? ? ? B+樹(shù)是對(duì)B樹(shù)的優(yōu)化,主要是從兩個(gè)地方進(jìn)行優(yōu)化的:

? ? ? ? 第一個(gè)優(yōu)化是在每個(gè)葉子節(jié)點(diǎn)之間加上了一個(gè)雙向指針,指向相鄰節(jié)點(diǎn),這樣就解決了剛才的范圍查詢問(wèn)題,范圍查詢?nèi)绻缌硕鄠€(gè)節(jié)點(diǎn),就可以通過(guò)這個(gè)雙向指針快速找到相鄰節(jié)點(diǎn),而不需要通過(guò)局部的中序遍歷,從而減少了io次數(shù)。下圖演示的是B+樹(shù):

? ? ? ?但如果要找的元素不在葉子節(jié)點(diǎn)上呢?別擔(dān)心,B+樹(shù)的另一個(gè)優(yōu)化就是的葉子節(jié)點(diǎn)包含了這顆樹(shù)的所有元素!B+樹(shù)的非葉子節(jié)點(diǎn)不再保存元素的data數(shù)據(jù)或者指針了,只是作為冗余的索引構(gòu)成完整的B+樹(shù)來(lái)方便查詢??梢钥吹缴蠄D的15號(hào)元素不僅僅存在于非葉子節(jié)點(diǎn)中,也存在于葉子節(jié)點(diǎn)中。這樣的設(shè)計(jì)雖然帶來(lái)了很多冗余的索引,但是卻讓范圍查詢時(shí)不再需要向上查找非葉子節(jié)點(diǎn)了,而且每一層可以保存的索引數(shù)量變多了,讓數(shù)據(jù)庫(kù)每次io可以查詢到更多的索引元素,畢竟在正常情況下,數(shù)據(jù)占的空間比索引占的空間要大很多。(需要注意的是,InnoDB和MyISAM引擎雖然都是用的B+樹(shù),但I(xiàn)nnoDB的聚簇索引和數(shù)據(jù)是保存在一起的,而MyISAM是將聚簇索引和相應(yīng)數(shù)據(jù)的指針保存在一起的,索引和數(shù)據(jù)是分開(kāi)的。MyISAM引擎下的B+樹(shù)也只有葉子節(jié)點(diǎn)才保存數(shù)據(jù)的指針)

? ? ? ? 由上面的分析我們可以知道,選用B+樹(shù)作為MySQL的底層是為了減少io次數(shù),那我們?yōu)槭裁床恢苯訕O端一點(diǎn),使用hash來(lái)保存數(shù)據(jù)或者索引呢?其實(shí)MySQL確實(shí)支持hash類型的索引。

? ? ? ? 但是hash索引一般都不用,主要是因?yàn)閔ash索引的儲(chǔ)存的是hash碼,儲(chǔ)存的順序與索引列的值大小無(wú)關(guān),所以只有在進(jìn)行精確查找時(shí)hash索引才能生效,范圍查詢時(shí)會(huì)進(jìn)行全表掃描。同時(shí),如果表中的數(shù)據(jù)量非常大的話,發(fā)生hash碰撞的次數(shù)會(huì)增多,單個(gè)查找的效率不一定比B+樹(shù)高。

? ? ? ? 簡(jiǎn)單總結(jié)一下,B+樹(shù)相比其他樹(shù)來(lái)說(shuō),每個(gè)節(jié)點(diǎn)可以存儲(chǔ)更多元素,可以大大減少查詢時(shí)需要的io次數(shù),非葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)或指針的設(shè)計(jì)可以提高每個(gè)節(jié)點(diǎn)存儲(chǔ)元素的數(shù)量,葉子節(jié)點(diǎn)具有的雙向指針可以提高范圍查詢的效率。

到此這篇關(guān)于MySQL底層數(shù)據(jù)結(jié)構(gòu)選用B+樹(shù)的原因的文章就介紹到這了,更多相關(guān)MySQL B+樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中Bit數(shù)據(jù)類型的使用方式

    MySQL中Bit數(shù)據(jù)類型的使用方式

    這篇文章主要介紹了MySQL中Bit數(shù)據(jù)類型的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 查看mysql當(dāng)前連接數(shù)的方法詳解

    查看mysql當(dāng)前連接數(shù)的方法詳解

    這篇文章主要介紹了查看mysql當(dāng)前連接數(shù)的方法詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Mysql InnoDB的鎖定機(jī)制實(shí)例詳解

    Mysql InnoDB的鎖定機(jī)制實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Mysql InnoDB的鎖定機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • MySQL ddl語(yǔ)句的使用

    MySQL ddl語(yǔ)句的使用

    這篇文章主要介紹了MySQL ddl語(yǔ)句的使用,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • MySQL5.7 如何通過(guò)邏輯備份遷移到GreatSQL及注意事項(xiàng)

    MySQL5.7 如何通過(guò)邏輯備份遷移到GreatSQL及注意事項(xiàng)

    在將數(shù)據(jù)庫(kù)從MySQL 5.7遷移到GreatSQL8.0.32時(shí),由于數(shù)據(jù)量較小且關(guān)注安全性,決定使用mysqldump執(zhí)行邏輯備份,并將數(shù)據(jù)導(dǎo)入GreatSQL,這篇文章主要介紹了MySQL5.7 通過(guò)邏輯備份遷移到GreatSQL注意事項(xiàng),需要的朋友可以參考下
    2024-06-06
  • sql server自動(dòng)編號(hào)的三種方法

    sql server自動(dòng)編號(hào)的三種方法

    自增列是最簡(jiǎn)單和常見(jiàn)的方法,適用于大多數(shù)情況,本文介紹了SQL Server中三種常見(jiàn)的自動(dòng)編號(hào)方法:自增列、序列和觸發(fā)器,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 如何配置全世界最小的 MySQL 服務(wù)器

    如何配置全世界最小的 MySQL 服務(wù)器

    Intel Edison 是一個(gè)小巧的計(jì)算機(jī)基于 22 nm 的 Silvermont 雙核 Intel Atom CPU 主頻 500MHz運(yùn)行 Linux (叫做 Yocto 的基于 Ubuntu 的發(fā)布版)。為了對(duì) Edison 進(jìn)行編程,我們需要一塊接口板??梢赃x擇的板子包括兼容Arduino的接口板 (包含了 SD 卡) 還有 Intel 接口板。
    2016-04-04
  • mysql8.0.11 winx64安裝配置教程

    mysql8.0.11 winx64安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了mysql8.0.11 winx64安裝配置教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Mysql之服務(wù)的啟動(dòng)、停止、重啟方式

    Mysql之服務(wù)的啟動(dòng)、停止、重啟方式

    本文介紹了在終端操作命令以及處理隱藏文件夾的兩種方法:一種是直接在終端輸入命令啟動(dòng)、停止和重啟;另一種是通過(guò)拖拽文件到終端并添加命令如start或stop,同時(shí),介紹了如何通過(guò)命令顯示隱藏的usr文件夾并重新啟動(dòng)Finder以訪問(wèn)
    2024-10-10
  • 淺談MySQL8.0 異步復(fù)制的三種方式

    淺談MySQL8.0 異步復(fù)制的三種方式

    這篇文章主要介紹了淺談MySQL8.0 異步復(fù)制的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

峡江县| 东乌珠穆沁旗| 濉溪县| 乐都县| 肥城市| 交口县| 武鸣县| 佛学| 新乐市| 勃利县| 惠来县| 平泉县| 玛沁县| 北流市| 天柱县| 广南县| 环江| 中江县| 博爱县| 垦利县| 桐庐县| 清水河县| 连城县| 白银市| 金昌市| 溧阳市| 甘谷县| 亳州市| 新化县| 达日县| 东方市| 嘉荫县| 新平| 海盐县| 博客| 潮安县| 资讯 | 嘉禾县| 合肥市| 万源市| 屏南县|