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

mysql 使用B+樹索引有哪些優(yōu)勢

 更新時間:2021年01月29日 14:11:12   作者:雪山飛豬  
這篇文章主要介紹了mysql 使用B+樹索引有哪些優(yōu)勢,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

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

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

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

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

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

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

  1. 在一棵B+樹中,每個節(jié)點為都是一個頁,每次新建節(jié)點的時候,就會申請一個頁空間
  2. 同一層的節(jié)點為之間,通過頁的結(jié)構(gòu)構(gòu)成了一個雙向鏈表
  3. 非葉子節(jié)點為,包括了多個索引行,每個索引行里存儲索引鍵和指向下一層頁面的指針
  4. 葉子節(jié)點為,存儲了關(guān)鍵字和行記錄,在節(jié)點內(nèi)部(也就是頁結(jié)構(gòu)的內(nèi)部)記錄之間是一個單向的鏈表

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

有以下幾個特點

  1. 將所有的記錄分成幾個組, 每組會存儲多條記錄,
  2. 頁目錄存儲的是槽(slot),槽相當(dāng)于分組記錄的索引,每個槽指針指向了不同組的最后一個記錄
  3. 我們通過槽定位到組,再查看組中的記錄

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

B+樹的檢索過程

我們再來看下B+樹的檢索過程

  1. 從B+樹的根開始,逐層找到葉子節(jié)點。
  2. 找到葉子節(jié)點為對應(yīng)的數(shù)據(jù)頁,將數(shù)據(jù)葉加載到內(nèi)存中,通過頁目錄的槽采用二分查找的方式先找到一個粗略的記錄分組。
  3. 在分組中通過鏈表遍歷的方式進(jìn)行記錄的查找。

為什么要用B+樹索引

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

下面,我們來對比一個二叉樹、多叉樹、B樹和B+樹。

二叉樹

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

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

多叉樹

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

B樹

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

例如要查找9,步驟如下

  1. 我們與根節(jié)點的關(guān)鍵字 (17,35)進(jìn)行比較,9 小于 17 那么得到指針 P1;
  2. 按照指針 P1 找到磁盤塊 2,關(guān)鍵字為(8,12),因為 9 在 8 和 12 之間,所以我們得到指針 P2;
  3. 按照指針 P2 找到磁盤塊 6,關(guān)鍵字為(9,10),然后我們找到了關(guān)鍵字 9。

B+樹

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

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

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

  1. 與根節(jié)點的關(guān)鍵字 (1,18,35) 進(jìn)行比較,16 在 1 和 18 之間,得到指針 P1(指向磁盤塊 2)
  2. 找到磁盤塊 2,關(guān)鍵字為(1,8,14),因為 16 大于 14,所以得到指針 P3(指向磁盤塊 7)
  3. 找到磁盤塊 7,關(guān)鍵字為(14,16,17),然后我們找到了關(guān)鍵字 16,所以可以找到關(guān)鍵字 16 所對應(yīng)的數(shù)據(jù)。

B+樹與B樹的不同:

  1. B+樹非葉子節(jié)點不存在數(shù)據(jù)只存索引,B樹非葉子節(jié)點存儲數(shù)據(jù)
  2. B+樹查詢效率更高。B+樹使用雙向鏈表串連所有葉子節(jié)點,區(qū)間查詢效率更高(因為所有數(shù)據(jù)都在B+樹的葉子節(jié)點,掃描數(shù)據(jù)庫 只需掃一遍葉子結(jié)點就行了),但是B樹則需要通過中序遍歷才能完成查詢范圍的查找。
  3. B+樹查詢效率更穩(wěn)定。B+樹每次都必須查詢到葉子節(jié)點才能找到數(shù)據(jù),而B樹查詢的數(shù)據(jù)可能不在葉子節(jié)點,也可能在,這樣就會造成查詢的效率的不穩(wěn)定
  4. B+樹的磁盤讀寫代價更小。B+樹的內(nèi)部節(jié)點并沒有指向關(guān)鍵字具體信息的指針,因此其內(nèi)部節(jié)點相對B樹更小,通常B+樹矮更胖,高度小查詢產(chǎn)生的I/O更少。

這就是MySQL使用B+樹的原因,就是這么簡單!

以上就是mysql 使用B+樹索引有哪些優(yōu)勢的詳細(xì)內(nèi)容,更多關(guān)于MySQL 使用B+樹索引的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL的LEFT JOIN表連接的進(jìn)階學(xué)習(xí)教程

    MySQL的LEFT JOIN表連接的進(jìn)階學(xué)習(xí)教程

    這篇文章主要介紹了MySQL的LEFT JOIN表連接的進(jìn)階學(xué)習(xí)教程,包括對左連接的查詢效率分析以及相關(guān)建議,需要的朋友可以參考下
    2015-12-12
  • MySql三種避免重復(fù)插入數(shù)據(jù)的方法

    MySql三種避免重復(fù)插入數(shù)據(jù)的方法

    這篇文章主要介紹了MySql三種避免重復(fù)插入數(shù)據(jù)的方法,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • Mysql中幻讀的概念以及如何解決

    Mysql中幻讀的概念以及如何解決

    這篇文章主要介紹了Mysql中幻讀的概念以及如何解決,幻讀指的是一個事務(wù)在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的行,需要的朋友可以參考下
    2023-05-05
  • Mysql?遠(yuǎn)程連接遇到的問題排查

    Mysql?遠(yuǎn)程連接遇到的問題排查

    無法連接到遠(yuǎn)程MySQL數(shù)據(jù)庫可能是由于多種原因?qū)е碌?本文主要介紹了Mysql遠(yuǎn)程連接遇到的問題排查,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Navicat連接不上MySQL的問題解決

    Navicat連接不上MySQL的問題解決

    最近遇到了一件非常棘手的問題,用Navicat遠(yuǎn)程連接數(shù)據(jù)庫居然連接不到,真是頭都大了,下面這篇文章主要給大家介紹了關(guān)于Navicat連接不上MySQL的問題解決,需要的朋友可以參考下
    2023-02-02
  • 如何使用mysql完成excel中的數(shù)據(jù)生成

    如何使用mysql完成excel中的數(shù)據(jù)生成

    這篇文章主要介紹了如何使用mysql完成excel中的數(shù)據(jù)生成的相關(guān)資料,需要的朋友可以參考下
    2017-11-11
  • mysql5.7.19 解壓版安裝教程詳解(附送純凈破解中文版SQLYog)

    mysql5.7.19 解壓版安裝教程詳解(附送純凈破解中文版SQLYog)

    Mysql5.7.19版本是今年新推出的版本,最近幾個版本的MySQL都不再是安裝版,都是解壓版了,大家在使用過程中遇到很多問題,下面小編給大家?guī)砹薓ySQL5.7.19 解壓版安裝教程詳解,感興趣的朋友一起看看吧
    2017-10-10
  • MySQL中的運(yùn)算符使用實例展示

    MySQL中的運(yùn)算符使用實例展示

    請問,什么是最好的參考文檔,我的答案是:真實可行的樣例語句。
    2010-12-12
  • mysql如何執(zhí)行流程

    mysql如何執(zhí)行流程

    MySQL主要分為server層和存儲引擎層,server層負(fù)責(zé)連接、查詢緩存、分析、優(yōu)化和執(zhí)行,存儲引擎層負(fù)責(zé)數(shù)據(jù)存儲和提取,SQL查詢執(zhí)行流程包括連接、認(rèn)證、權(quán)限檢查、分析、優(yōu)化和執(zhí)行,更新語句執(zhí)行涉及重做日志(redolog)和歸檔日志(binlog)
    2024-11-11
  • navicat連接mysql報錯10060的解決辦法

    navicat連接mysql報錯10060的解決辦法

    最近在學(xué)習(xí)中遇到了個小問題,現(xiàn)在將解決的辦法分享給同樣遇到這個問題的同學(xué),這篇文章主要給大家介紹了關(guān)于navicat連接mysql報錯10060的解決辦法,需要的朋友可以參考下
    2023-03-03

最新評論

蕲春县| 中山市| 平昌县| 桃源县| 奇台县| 克东县| 日喀则市| 马边| 竹山县| 札达县| 松桃| 伊吾县| 濮阳县| 津市市| 贵阳市| 临朐县| 汶上县| 三门峡市| 彰化市| 靖州| 于田县| 榕江县| 志丹县| 岫岩| 仁布县| 揭阳市| 文水县| 吉木乃县| 黔南| 新兴县| 南投县| 太康县| 民和| 江孜县| 土默特右旗| 鄂伦春自治旗| 公安县| 建始县| 县级市| 枝江市| 马龙县|