chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

圖解B+樹的生成過程!

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-12-01 10:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


本文大概字數(shù)三千多,預(yù)計觀看時長十分鐘,練習(xí)時長兩個半小時。希望大家都能學(xué)到知識。

前提

不少網(wǎng)友看 B+ 樹,看不懂樹結(jié)構(gòu)什么意思。希望本文可以幫你理解樹結(jié)構(gòu)生成的過程。

在說 B+ 樹之前,需要知道,一頁的大小是多少。

showglobalstatuslike'innodb_page_size'
eaf95904-711c-11ed-8abf-dac502259ad0.jpgMySQL一頁16kb

這個是看出,一頁是 16384 也就是16384/1024 = 16kbinnodb 中一頁的大小默認是 16kb。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

正文

創(chuàng)建表結(jié)構(gòu) 指定引擎為 Innodb。

CREATETABLEtree(
idintPRIMARYkeyauto_increment,
t_nameVARCHAR(20),
t_codeint
)ENGINE=INNODB

查看一下當(dāng)前表的索引情況

showindexfromtree

B 樹和 B+ 樹的顯示都是 BTREE,但是實際使用的 B+ 樹。B+ 樹也是 B 樹的升級版,這里顯示為 B 樹也是沒有問題的。

eb0f3fda-711c-11ed-8abf-dac502259ad0.jpgBTREE

創(chuàng)建數(shù)據(jù),這里會有一個小知識點,如果看過上一篇文章的朋友可以明白是為什么。

INSERTintotreeVALUES(3,"變成派大星",3);
INSERTintotreeVALUES(1,"變成派大星",1);
INSERTintotreeVALUES(2,"變成派大星",2);
INSERTintotreeVALUES(4,"變成派大星",4);
INSERTintotreeVALUES(7,"變成派大星",7);
INSERTintotreeVALUES(5,"變成派大星",5);
INSERTintotreeVALUES(6,"變成派大星",6);
INSERTintotreeVALUES(8,"變成派大星",8);
eb24a06e-711c-11ed-8abf-dac502259ad0.jpg插入測試數(shù)據(jù)

疑問

為什么創(chuàng)建數(shù)據(jù)的時候數(shù)據(jù)是亂序的,但是在創(chuàng)建好數(shù)據(jù),被排好順序了。

基礎(chǔ)知識

我們在尋找答案之前,想明白一些基礎(chǔ)知識。

細心的朋友可以看出來,我們插入 Id 時候數(shù)據(jù)是亂的,插入進去之后,數(shù)據(jù)就自動幫我通過 Id 進行排序了,這是為什么呢?接著往下看。

我們?nèi)绻麑τ?B+ 樹有點了解的話就知道 B+ 樹是每頁 16KB 進行數(shù)據(jù)儲存。在進行數(shù)據(jù)查詢的時候也是一頁一頁的去查詢。

相當(dāng)于下面的數(shù)據(jù)。

首先每一頁都有很多數(shù)據(jù),就像我們平常去寫分頁的時候我們返回給前端的數(shù)據(jù)也會有很多屬性。

eb366c36-711c-11ed-8abf-dac502259ad0.jpgMySQL數(shù)據(jù)頁

這個可能比較抽象,我是把他當(dāng)成平常,分頁查詢的思想代入進去。

我們可以把一頁想成是一個對象。

@Data
publicclasspage{
Listdata;
//....省略其余屬性
}

我們先看一下,一頁數(shù)據(jù)的圖是什么樣子,僅僅是進行邏輯思考畫的圖。

這里的 Data,就相當(dāng)于 一頁中的數(shù)據(jù)區(qū)域。

eb466f96-711c-11ed-8abf-dac502259ad0.jpg數(shù)據(jù)區(qū)域

但是這里是有限制的,上面我們說到,一頁的數(shù)據(jù)只能是 16Kb,也就是一個 Page 里面的 data 只能16Kb。當(dāng)數(shù)據(jù)超過 16Kb,就會新開一個對象相當(dāng)于在進行創(chuàng)建樹的時候增加了判斷。

Java 代碼思路模擬

eb5ba1c2-711c-11ed-8abf-dac502259ad0.jpgJava模擬MySQL數(shù)據(jù)頁

當(dāng) Page 對象的大小已經(jīng)達到16Kb 就算完成這一頁。把這一頁放到,磁盤中等待使用就行了,到時候進行查詢數(shù)據(jù)的時候會直接返回這一頁,里面包含這些數(shù)據(jù)。

我們回到最初的問題 為什么我們在進行插入的時候明明 Id 是亂的?等到插入到數(shù)據(jù)的時候,數(shù)據(jù)就變成有序的了?我們知道,同時這個數(shù)據(jù)是根據(jù)主鍵進行排序的,InnoDB 的數(shù)據(jù)儲存一定是要依賴主鍵的,有些人會想,我就是不創(chuàng)建主鍵,他還能排序嗎?

疑問二

我們在疑問一的基礎(chǔ)上,產(chǎn)生出的疑問,不設(shè)置主鍵 Mysql 怎么辦?

解答

InnoDB 對聚簇索引處理如下:

  • 如果定義了主鍵,那么 InnoDB 會使用主鍵作為聚簇索引
  • 如果沒有定義主鍵,那么會使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作為聚簇索引
  • 如果既沒有主鍵也找不到合適的非空索引,InnoDB 會自動幫你創(chuàng)建一個不可見的、長度為 6 字節(jié)的 row_id,而且 InnoDB 維護了一個全局的 dictsys.row_id,所以未定義主鍵的表都共享該row_id,每次插入一條數(shù)據(jù),都把全局 row_id 當(dāng)成主鍵 id,然后全局 row_id 加 1

很明顯,缺少主鍵的表,InnoDB 會內(nèi)置一列用于聚簇索引來組織數(shù)據(jù)。而沒有建立主鍵的話就沒法通過主鍵來進行索引,查詢的時候都是全表掃描,小數(shù)據(jù)量沒問題,大數(shù)據(jù)量就會出現(xiàn)性能問題。

但是,問題真的只是查詢影響嗎?不是的,對于生成的 ROW_ID,其自增的實現(xiàn)來源于一個全局的序列,而所以有 ROW_ID 的表共享該序列,這也意味著插入的時候生成需要共享一個序列,那么高并發(fā)插入的時候為了保持唯一性就避免不了鎖的競爭,進而影響性能

解答

我們看完疑問二的解答就知道,即便我們不設(shè)置主鍵。數(shù)據(jù)也會幫我們?nèi)ド梢粋€默認的主鍵,有點像,類默認生成構(gòu)造器的思想。

有了主鍵之后呢?

eb6f4362-711c-11ed-8abf-dac502259ad0.jpg表中有主鍵

為什么會自動排序,大家都知道了。其實在文章之初就會有很多人明白是為什么,大概腦子里會有答案。

疑問三

為什么要進行排序?

解答

我們都知道,在進行數(shù)據(jù)查找的時候,比如幾個基礎(chǔ)的查找算法的,前提都是,先進行排序。再者 List 和 Map 的一些區(qū)別肯定都很熟悉了。排序當(dāng)然是為了更快,所以無須的 Id 會對插入效率造成影響,也就是為什么很多文章說使用自增 Id 比 UUID 或者雪花算效率高的原因。第一個是 UUID 他們是隨機的 每次都要重新排序,甚至可能會因為排序的原因造成頁數(shù)據(jù)的更換。還有就是 UUID 一般都比較長,一頁是 16Kb 數(shù)據(jù)越短。一頁的數(shù)據(jù)就會越多,查詢的速度也就比較快。

這里說完為什么排序 還有一個點就是上面的「頁目錄」

疑問三

頁目錄的作用是什么?

頁目錄的作用是減少范圍。

eb885d0c-711c-11ed-8abf-dac502259ad0.jpg頁目錄

這里的第三層是數(shù)據(jù),上面都是目錄,可以增加數(shù)據(jù)的檢索效率。

eba9746a-711c-11ed-8abf-dac502259ad0.jpg頁目錄增加數(shù)據(jù)的檢索效率

如果沒有目錄我們需要去直接遍歷數(shù)據(jù)區(qū)域,會降低效率。目錄能幫我們縮小范圍,這里,我們查詢 ID = 3。我們可以通過目錄知道 1 < 3 < 4,如果在 1 中沒有找到對應(yīng)數(shù)據(jù)。但是因為 3 < 4 就不會接著往下查詢了,直接返回空結(jié)果。

當(dāng)?shù)谝豁摏]有的時候去第二頁查詢,不會直接跳到第二頁查詢。

ebc12d6c-711c-11ed-8abf-dac502259ad0.jpg提高范圍查找效率

為了提高效率,當(dāng)目錄數(shù)據(jù)數(shù)量過多時,就會網(wǎng)上延伸一層樹,同時可以減少磁盤的 IO 次數(shù)。

ebe4f68e-711c-11ed-8abf-dac502259ad0.jpg索引就是一顆樹

關(guān)于所有葉子節(jié)點都處于同一深度是如何實現(xiàn)的?這與 B+ 樹具體的插入和刪除算法有關(guān)。簡單解釋一下插入時的情況,根據(jù)插入值的大小,逐步向下直到對應(yīng)的葉子節(jié)點。如果葉子節(jié)點關(guān)鍵字個數(shù)小于 2t,則直接插入值或者更新衛(wèi)星數(shù)據(jù);如果插入之前葉子節(jié)點已經(jīng)滿了,則分裂該葉子節(jié)點成兩半,并把中間值提上到父節(jié)點的關(guān)鍵字中,如果這導(dǎo)致父節(jié)點滿了的話,則把該父節(jié)點分裂,如此遞歸向上。所以樹高是一層層的增加的,葉子節(jié)點永遠都在同一深度。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

小總結(jié)

  • 內(nèi)部節(jié)點并不存儲真正的信息,而是保存其葉子節(jié)點的最小值作為索引。
  • 每次插入刪除都進行更新(此時用到parent指針),保持最新狀態(tài)。
  • B+ 樹非葉子節(jié)點上是不存儲數(shù)據(jù)的,僅存儲鍵值
  • B+ 樹只在葉子節(jié)點上儲存“數(shù)據(jù)”,上層就會存儲更多的鍵值,相應(yīng)的樹的階數(shù)(節(jié)點的子節(jié)點樹)就會更大,樹就會更矮更胖,如此一來我們查找數(shù)據(jù)進行磁盤的 IO 次數(shù)又會再次減少,數(shù)據(jù)查詢的效率也會更快。
  • B+ 樹的階數(shù)是等于鍵值的數(shù)量的,如果我們的 B+ 樹一個節(jié)點可以存儲 1000 個鍵值,那么 3 層 B+ 樹可以存儲 1000×1000×1000=10 億個數(shù)據(jù)。
  • 一般根節(jié)點是常駐內(nèi)存的,所以一般我們查找 10 億數(shù)據(jù),只需要 2 次磁盤 IO。
  • 因為 B+ 樹索引的所有“數(shù)據(jù)”均存儲在葉子節(jié)點,而且數(shù)據(jù)是按照順序排列的。
  • 那么 B+ 樹使得范圍查找,排序查找,分組查找以及去重查找變得異常簡單
  • 有心的讀者可能還發(fā)現(xiàn)上圖 B+ 樹中各個頁之間是通過雙向鏈表連接的,葉子節(jié)點中的數(shù)據(jù)是通過單向鏈表連接的。
  • 其實上面的 B 樹我們也可以對各個節(jié)點加上鏈表。這些不是它們之前的區(qū)別,是因為在 MySQL 的 InnoDB 存儲引擎中,索引就是這樣存儲的。
  • 我們通過數(shù)據(jù)頁之間通過雙向鏈表連接以及葉子節(jié)點中數(shù)據(jù)之間通過單向鏈表連接的方式可以找到表中所有的數(shù)據(jù)。

結(jié)尾

感覺寫的有點啰嗦了 但是還是有點加深印象的 后續(xù)會接著整理一下相關(guān)的資料 補充進來

  • 如果你是直接跳到這里,看看文章有多長 建議收藏
  • 如果你一步步看到這里,感覺有點幫助 贊贊來一個
  • 如果感覺文章有問題,建議評論區(qū)指出 會修正

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7256

    瀏覽量

    91868
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    860

    瀏覽量

    27938

原文標題:圖解B+樹的生成過程!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    想在rtsmart中使用uart2,是不是只能通過修改設(shè)備方法來實現(xiàn)uart2的復(fù)用呀?

    我想在rtsmart中使用uart2,是不是只能通過修改設(shè)備方法來實現(xiàn)uart2的復(fù)用呀? 修改設(shè)備后如何只編譯設(shè)備文件? 編譯生成的文件可以直接替換到廬山派里嗎,具體替換路徑在
    發(fā)表于 06-24 07:04

    圖解單片機功能與應(yīng)用(完整版)

    從基礎(chǔ)知識的介紹出發(fā),圖文并茂,直觀、系統(tǒng)地介紹了單片機的內(nèi)部結(jié)構(gòu)、工作原理和應(yīng)用技巧。全書分為10章,內(nèi)容包括51單片機編程資源圖解、51單片機指令系統(tǒng)圖解、匯編語言程序設(shè)計圖解、輸入/輸出
    發(fā)表于 06-16 16:52

    北大教授領(lǐng)銜,無錫一傳感器公司完成B+輪數(shù)千萬元融資

    近日,北微傳感科技有限公司(下文簡稱“北微傳感”)宣布,已完成數(shù)千萬B+輪融資。本輪投資方尚未公布。
    的頭像 發(fā)表于 05-13 10:36 ?252次閱讀

    PCB封裝圖解

    PCB封裝圖解——詳細介紹了各種封裝的具體參數(shù),并介紹了如何進行封裝制作 純分享貼,有需要可以直接下載附件獲取文檔! (如果內(nèi)容有幫助可以關(guān)注、點贊、評論支持一下哦~)
    發(fā)表于 04-22 13:44

    ?Diffusion生成式動作引擎技術(shù)解析

    開發(fā)、虛擬現(xiàn)實、影視動畫和機器人控制等領(lǐng)域具有廣泛應(yīng)用前景。以下是其核心原理、技術(shù)實現(xiàn)和應(yīng)用方向的詳細解析: 一、核心原理 擴散模型基礎(chǔ) Diffusion模型通過逐步添加噪聲破壞數(shù)據(jù)(正向過程),再學(xué)習(xí)逆向去噪過程(逆向過程
    的頭像 發(fā)表于 03-17 15:14 ?1841次閱讀

    宏誠創(chuàng)新獲B+輪融資追加投資

    近日,北京宏誠創(chuàng)新科技有限公司傳來喜訊,成功獲得B+輪融資的追加投資,本輪追加投資由國資基金山東省文化發(fā)展投資基金注入。 此前,宏誠創(chuàng)新已經(jīng)獲得了由亦莊國投和云洲資本領(lǐng)投的1億元人民幣B+輪投資。而
    的頭像 發(fā)表于 02-13 09:58 ?394次閱讀

    使用TFTP加載內(nèi)核設(shè)備

    在嵌入式項目開發(fā)中,為了適配新外設(shè)、調(diào)整硬件資源分配或修復(fù)驅(qū)動問題,需要頻繁修改設(shè)備和內(nèi)核。修改完成后,通常需要重新編譯生成鏡像,并將其燒錄到開發(fā)板上進行測試。然而,傳統(tǒng)的燒錄方式不僅需要連接物理接口,還可能因為鏡像體積較大而耗費較長時間,這在開發(fā)周期緊張的情況下顯得尤
    的頭像 發(fā)表于 01-17 15:52 ?1452次閱讀
    使用TFTP加載內(nèi)核設(shè)備<b class='flag-5'>樹</b>

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核移植之編譯后生成文件說明

    二進制文件,它是由設(shè)備編譯工具DTC (Device tree compiler)編譯dts文件而生成的。關(guān)于設(shè)備的知識,我們在之后章節(jié)有詳細介紹。 zImage是經(jīng)過壓縮之后的鏡像文件,其
    發(fā)表于 12-19 09:11

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核移植之編譯后生成文件說明

    文件,它是由設(shè)備編譯工具DTC (Device tree compiler)編譯dts文件而生成的。關(guān)于設(shè)備的知識,我們在之后章節(jié)有詳細介紹。zImage是經(jīng)過壓縮之后的鏡像文件,其生成
    發(fā)表于 12-18 08:52

    C語言生成可執(zhí)行二進制文件的具體過程

    C語言源碼到生成可執(zhí)行文件的過程通常包括預(yù)處理(Preprocessing)、編譯(Compilation)、匯編(Assembly)、鏈接(Linking)等多個步驟,每個步驟都有其特定的任務(wù)
    的頭像 發(fā)表于 10-21 14:30 ?1623次閱讀
    C語言<b class='flag-5'>生成</b>可執(zhí)行二進制文件的具體<b class='flag-5'>過程</b>

    NVIDIA Nemotron-4 340B模型幫助開發(fā)者生成合成訓(xùn)練數(shù)據(jù)

    Nemotron-4 340B 是針對 NVIDIA NeMo 和 NVIDIA TensorRT-LLM 優(yōu)化的模型系列,該系列包含最先進的指導(dǎo)和獎勵模型,以及一個用于生成式 AI 訓(xùn)練的數(shù)據(jù)集。
    的頭像 發(fā)表于 09-06 14:59 ?738次閱讀
    NVIDIA Nemotron-4 340<b class='flag-5'>B</b>模型幫助開發(fā)者<b class='flag-5'>生成</b>合成訓(xùn)練數(shù)據(jù)

    人工智能大模型公司卓世科技完成億元B+輪融資

    近日,國內(nèi)領(lǐng)先的人工智能大模型解決方案提供商卓世科技宣布成功完成億元級B+輪融資,此輪融資由業(yè)界知名投資機構(gòu)同創(chuàng)偉業(yè)領(lǐng)投,同時吸引了青島國資平臺青島海發(fā)及啟迪之星等重量級機構(gòu)的跟投,彰顯了資本市場對卓世科技在人工智能領(lǐng)域創(chuàng)新實力及未來發(fā)展前景的高度認可。
    的頭像 發(fā)表于 08-13 17:50 ?948次閱讀

    壹沓科技完成B+輪融資,加速大供應(yīng)鏈超自動化進程

    近日,全球領(lǐng)先的數(shù)字員工機器人公司——壹沓科技宣布成功完成B+輪融資,此輪融資由鼎暉VGC(創(chuàng)新與成長基金)領(lǐng)投,新尚資本跟投,彰顯了資本市場對壹沓科技在大供應(yīng)鏈領(lǐng)域超自動化解決方案的高度認可與信心。
    的頭像 發(fā)表于 08-09 18:13 ?1674次閱讀

    地芯科技完成近億元B+輪融,加速高端模擬射頻芯片發(fā)展

    近日,國內(nèi)領(lǐng)先的高端模擬射頻芯片研發(fā)企業(yè)——地芯科技,宣布成功完成近億元的B+輪融資。本輪融資由鴻富資產(chǎn)、九智資本及鴻鵠致遠投資共同注資,標志著地芯科技在資本市場上的強勁勢頭和廣泛認可。
    的頭像 發(fā)表于 08-01 17:15 ?1086次閱讀

    地芯科技完成B+輪融資,開啟發(fā)展新紀元

    近日,地芯科技完成近億元B+輪融資,本輪融資由鴻富資產(chǎn)、九智資本、鴻鵠致遠投資共同參與完成。本輪融資資金將主要用于高端人才引入、技術(shù)持續(xù)研發(fā)、產(chǎn)品體系豐富和市場開拓布局。 本輪融資不僅獲得多家頂級
    發(fā)表于 07-31 13:47 ?432次閱讀