<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL為什么要使用B+樹索引

          共 1987字,需瀏覽 4分鐘

           ·

          2021-01-20 22:32

          搞懂這個(gè)問題之前,我們首先來看一下MySQL表的存儲(chǔ)結(jié)構(gòu),再分別對(duì)比二叉樹、多叉樹、B樹和B+樹的區(qū)別就都懂了。

          MySQL的存儲(chǔ)結(jié)構(gòu)

          表存儲(chǔ)結(jié)構(gòu)

          單位:表>段>區(qū)>頁>行

          在數(shù)據(jù)庫中, 不論讀一行,還是讀多行,都是將這些行所在的頁進(jìn)行加載。也就是說存儲(chǔ)空間的基本單位是頁。
          一個(gè)頁就是一棵樹B+樹的節(jié)點(diǎn),數(shù)據(jù)庫I/O操作的最小單位是頁,與數(shù)據(jù)庫相關(guān)的內(nèi)容都會(huì)存儲(chǔ)在頁的結(jié)構(gòu)里。

          B+樹索引結(jié)構(gòu)

          1. 在一棵B+樹中,每個(gè)節(jié)點(diǎn)為都是一個(gè)頁,每次新建節(jié)點(diǎn)的時(shí)候,就會(huì)申請(qǐng)一個(gè)頁空間

          2. 同一層的節(jié)點(diǎn)為之間,通過頁的結(jié)構(gòu)構(gòu)成了一個(gè)雙向鏈表

          3. 非葉子節(jié)點(diǎn)為,包括了多個(gè)索引行,每個(gè)索引行里存儲(chǔ)索引鍵和指向下一層頁面的指針

          4. 葉子節(jié)點(diǎn)為,存儲(chǔ)了關(guān)鍵字和行記錄,在節(jié)點(diǎn)內(nèi)部(也就是頁結(jié)構(gòu)的內(nèi)部)記錄之間是一個(gè)單向的鏈表

          B+樹頁節(jié)點(diǎn)結(jié)構(gòu)

          有以下幾個(gè)特點(diǎn)

          1. 將所有的記錄分成幾個(gè)組, 每組會(huì)存儲(chǔ)多條記錄,

          2. 頁目錄存儲(chǔ)的是槽(slot),槽相當(dāng)于分組記錄的索引,每個(gè)槽指針指向了不同組的最后一個(gè)記錄

          3. 我們通過槽定位到組,再查看組中的記錄

          頁的主要作用是存儲(chǔ)記錄,在頁中記錄以單鏈表的形式進(jìn)行存儲(chǔ)。
          單鏈表優(yōu)點(diǎn)是插入、刪除方便,缺點(diǎn)是檢索效率不高,最壞的情況要遍歷鏈表所有的節(jié)點(diǎn)。因此頁目錄中提供了二分查找的方式,來提高記錄的檢索效率。

          B+樹的檢索過程

          我們?cè)賮砜聪翨+樹的檢索過程

          1. 從B+樹的根開始,逐層找到葉子節(jié)點(diǎn)。

          2. 找到葉子節(jié)點(diǎn)為對(duì)應(yīng)的數(shù)據(jù)頁,將數(shù)據(jù)葉加載到內(nèi)存中,通過頁目錄的槽采用二分查找的方式先找到一個(gè)粗略的記錄分組。

          3. 在分組中通過鏈表遍歷的方式進(jìn)行記錄的查找。

          為什么要用B+樹索引

          數(shù)據(jù)庫訪問數(shù)據(jù)要通過頁,一個(gè)頁就是一個(gè)B+樹節(jié)點(diǎn),訪問一個(gè)節(jié)點(diǎn)相當(dāng)于一次I/O操作,所以越快能找到節(jié)點(diǎn),查找性能越好。
          B+樹的特點(diǎn)就是夠矮夠胖,能有效地減少訪問節(jié)點(diǎn)次數(shù)從而提高性能。

          下面,我們來對(duì)比一個(gè)二叉樹、多叉樹、B樹和B+樹。

          二叉樹

          二叉樹是一種二分查找樹,有很好的查找性能,相當(dāng)于二分查找。
          但是當(dāng)N比較大的時(shí)候,樹的深度比較高。數(shù)據(jù)查詢的時(shí)間主要依賴于磁盤IO的次數(shù),二叉樹深度越大,查找的次數(shù)越多,性能越差。
          最壞的情況是退化成了鏈表,如下圖

          為了讓二叉樹不至于退化成鏈表,人們發(fā)明了AVL樹(平衡二叉搜索樹):任何結(jié)點(diǎn)的左子樹和右子樹高度最多相差1

          多叉樹

          多叉樹就是節(jié)點(diǎn)可以是M個(gè),能有效地減少高度,高度變小后,節(jié)點(diǎn)變少I/O自然少,性能比二叉樹好了

          B樹

          B樹簡(jiǎn)單地說就是多叉樹,每個(gè)葉子會(huì)存儲(chǔ)數(shù)據(jù),和指向下一個(gè)節(jié)點(diǎn)的指針。

          例如要查找9,步驟如下

          1. 我們與根節(jié)點(diǎn)的關(guān)鍵字 (17,35)進(jìn)行比較,9 小于 17 那么得到指針 P1;

          2. 按照指針 P1 找到磁盤塊 2,關(guān)鍵字為(8,12),因?yàn)?9 在 8 和 12 之間,所以我們得到指針 P2;

          3. 按照指針 P2 找到磁盤塊 6,關(guān)鍵字為(9,10),然后我們找到了關(guān)鍵字 9。

          B+樹

          B+樹是B樹的改進(jìn),簡(jiǎn)單地說是:只有葉子節(jié)點(diǎn)才存數(shù)據(jù),非葉子節(jié)點(diǎn)是存儲(chǔ)的指針;所有葉子節(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表

          B+樹的內(nèi)部節(jié)點(diǎn)并沒有指向關(guān)鍵字具體信息的指針,因此其內(nèi)部節(jié)點(diǎn)相對(duì)B樹更小,如果把所有同一內(nèi)部節(jié)點(diǎn)的關(guān)鍵字存放在同一盤塊中,那么盤塊所能容納的關(guān)鍵字?jǐn)?shù)量也越多,一次性讀入內(nèi)存的需要查找的關(guān)鍵字也就越多,相對(duì)IO讀寫次數(shù)就降低了

          例如要查找關(guān)鍵字16,步驟如下

          1. 與根節(jié)點(diǎn)的關(guān)鍵字 (1,18,35) 進(jìn)行比較,16 在 1 和 18 之間,得到指針 P1(指向磁盤塊 2)

          2. 找到磁盤塊 2,關(guān)鍵字為(1,8,14),因?yàn)?16 大于 14,所以得到指針 P3(指向磁盤塊 7)

          3. 找到磁盤塊 7,關(guān)鍵字為(14,16,17),然后我們找到了關(guān)鍵字 16,所以可以找到關(guān)鍵字 16 所對(duì)應(yīng)的數(shù)據(jù)。

          B+樹與B樹的不同:

          1. B+樹非葉子節(jié)點(diǎn)不存在數(shù)據(jù)只存索引,B樹非葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)

          2. B+樹查詢效率更高。B+樹使用雙向鏈表串連所有葉子節(jié)點(diǎn),區(qū)間查詢效率更高(因?yàn)樗袛?shù)據(jù)都在B+樹的葉子節(jié)點(diǎn),掃描數(shù)據(jù)庫 只需掃一遍葉子結(jié)點(diǎn)就行了),但是B樹則需要通過中序遍歷才能完成查詢范圍的查找。

          3. B+樹查詢效率更穩(wěn)定。B+樹每次都必須查詢到葉子節(jié)點(diǎn)才能找到數(shù)據(jù),而B樹查詢的數(shù)據(jù)可能不在葉子節(jié)點(diǎn),也可能在,這樣就會(huì)造成查詢的效率的不穩(wěn)定

          4. B+樹的磁盤讀寫代價(jià)更小。B+樹的內(nèi)部節(jié)點(diǎn)并沒有指向關(guān)鍵字具體信息的指針,因此其內(nèi)部節(jié)點(diǎn)相對(duì)B樹更小,通常B+樹矮更胖,高度小查詢產(chǎn)生的I/O更少。

          source:https://www.cnblogs.com/chenqionghe/p/14295404.html

          喜歡,在看


          瀏覽 63
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久婷婷网 | 国产无码A片 | 人成在线网站 | 99热国产在线 | 中文字幕一区二区三区润滑油 |