国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?

這篇具有很好參考價值的文章主要介紹了MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

????????索引就像一本書的目錄,通過索引可以快速找到我們想要找的內(nèi)容。那么什么樣的數(shù)據(jù)結(jié)構(gòu)可以用來實(shí)現(xiàn)索引呢?我們可能會想到:二叉查找樹,平衡搜索樹,或者是B樹等等一系列的數(shù)據(jù)結(jié)構(gòu),那么為什么MySQL最終選擇了B+樹作為索引的數(shù)據(jù)結(jié)構(gòu)呢?

索引的“要求”

? ? ? ? 要想知道什么樣的數(shù)據(jù)結(jié)構(gòu)最適合索引,首先我們要知道索引需要什么?

????????首先,數(shù)據(jù)庫的索引時保存在磁盤上的,因此我們在查詢索引的時候,要先去磁盤上讀取索引到內(nèi)存,然后再通過索引找到要訪問的數(shù)據(jù),最后再去磁盤中讀取數(shù)據(jù),整個過程中會發(fā)生多次IO,那么我們自然希望發(fā)生磁盤IO的次數(shù)越小越好,這樣可以提高數(shù)據(jù)查詢的效率。

????????其次,MySQL是支持范圍查找的,所以我們希望通過索引可以進(jìn)行高效的范圍查找。

二叉查找樹

二叉查找樹可以在logN的時間內(nèi)找到目標(biāo)值,那么二叉查找樹適合用作索引嗎?

MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?,MySQL,數(shù)據(jù)結(jié)構(gòu),mysql,b樹,數(shù)據(jù)庫,b+樹

答案是不適合

????????首先,二叉查找樹存在極端情況,如果每次插入的結(jié)點(diǎn)都是最小或者最大的,那么二叉查找樹就會退化成鏈表,查詢的時間復(fù)雜度就從O(logN)降到了O(N)

? ? ? ? 其次,如果索引的數(shù)量很多,樹的高度也會變得很高,磁盤需要的IO次數(shù)也會不斷增加。

平衡二叉樹

?????????平衡二叉樹相比于二叉查找樹加上了一個條件:左右子樹高度差不能超過1;雖然這個條件避免了原先二叉查找樹中極端情況下會退化成鏈表的問題。

? ? ? ? 但是同樣的,當(dāng)樹中的結(jié)點(diǎn)不斷增加的時候,樹的高度高度也會不斷增加,同樣會使得IO次數(shù)不斷增加。

B樹

? ? ? ? 實(shí)際上,二叉查找樹和平衡二叉樹不適合作為索引的數(shù)據(jù)結(jié)構(gòu),究其本質(zhì)還是因?yàn)樗麄兪嵌鏄洌谑俏覀兛梢钥匆幌耺叉樹的一些數(shù)據(jù)結(jié)構(gòu),比如B樹。

? ? ? ? B樹不再限制一個節(jié)點(diǎn)就只能有2個子節(jié)點(diǎn),而是允許M個子節(jié)點(diǎn) (M>2),從而降低樹的高度。B樹的每一個節(jié)點(diǎn)最多可以包括M個子節(jié)點(diǎn),M稱為B樹的階,所以B樹就是一個多叉樹

? ? ? ? 使用了多叉樹的數(shù)據(jù)結(jié)構(gòu)以后,就解決了傳統(tǒng)二叉查找樹中隨著索引數(shù)量的增多,IO次數(shù)會變高的問題。在實(shí)際使用中,只要M大于100,即便是千萬級的數(shù)據(jù)量,仍然可以保證在3-4次IO內(nèi)就找到數(shù)據(jù)。相比與傳統(tǒng)的二叉樹,多叉樹會更加矮胖,更適合作為索引的數(shù)據(jù)結(jié)構(gòu)。

MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?,MySQL,數(shù)據(jù)結(jié)構(gòu),mysql,b樹,數(shù)據(jù)庫,b+樹

但是,MySQL仍然沒有選擇B樹,為什么呢?

????????首先B樹的每個節(jié)點(diǎn)都包含數(shù)據(jù)(索引+記錄),而用戶的記錄數(shù)據(jù)的大小很有可能遠(yuǎn)遠(yuǎn)超過了索引數(shù)據(jù),這就需要花費(fèi)更多的磁盤 I/O 操作次數(shù)來讀到真正需要的索引數(shù)據(jù)信息。

????????其次,MySQL是支持范圍查詢的,B樹進(jìn)行范圍查詢需要進(jìn)行樹的中序遍歷,需要使用遞歸或者迭代搜索來進(jìn)行遍歷,效率不高。

B+樹

最后,MySQL選擇了B+樹,B+樹的結(jié)構(gòu)大致如下所示:

MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?,MySQL,數(shù)據(jù)結(jié)構(gòu),mysql,b樹,數(shù)據(jù)庫,b+樹

B+樹和B樹很相似,差異如下:

  • 葉子節(jié)點(diǎn)(最底部的節(jié)點(diǎn))才會存放實(shí)際數(shù)據(jù)(索引+記錄),非葉子節(jié)點(diǎn)只會存放索引

  • 所有索引都會在葉子節(jié)點(diǎn)出現(xiàn),葉子節(jié)點(diǎn)之間構(gòu)成一個有序鏈表;

?這樣就解決了B樹的兩個缺陷。

????????B+樹的非葉子節(jié)點(diǎn)不存放實(shí)際的記錄數(shù)據(jù),僅存放索引,因此數(shù)據(jù)量相同的情況下,相比存儲即存索引又存記錄的B樹,B+樹的非葉子節(jié)點(diǎn)可以存放更多的索引,因此B+樹可以比B樹更矮胖,查詢底層節(jié)點(diǎn)的磁盤 I/O次數(shù)會更少。

????????B+樹所有葉子結(jié)點(diǎn)使用雙向鏈表連接,這使得其進(jìn)行范圍查找的時候,十分方便,相較于B樹范圍查詢效率更高。

總結(jié)

為什么采用B+樹作為索引的數(shù)據(jù)結(jié)構(gòu)?

1.和傳統(tǒng)的二叉查找樹相比,B+樹是一棵多叉樹,樹的高度更小,整個樹更加矮胖,查詢的效率更高;二叉樹的話,數(shù)據(jù)量上去了樹的高度就會很高。

(tips:實(shí)際使用中,m的值會超過100,此時即便是千萬級的數(shù)據(jù)量,仍然可以保證在3-4次IO內(nèi)就找到數(shù)據(jù))

2.和B樹相比文章來源地址http://www.zghlxwxcb.cn/news/detail-571862.html

  • B+樹的磁盤IO效率更高。B+樹的數(shù)據(jù)只會存放在葉子結(jié)點(diǎn)(非葉子節(jié)點(diǎn)只存索引信息),而B樹在每個節(jié)點(diǎn)上都要存放數(shù)據(jù),所以在相同的空間內(nèi),B+樹可以存放更多地索引信息,IO效率更高(單次IO獲得的索引信息量更大)
  • B+樹范圍查找效率更高,B樹進(jìn)行范圍查找需要進(jìn)行樹中序遍歷,而B+樹的葉子結(jié)點(diǎn)使用了雙向鏈表連接起來,范圍查找效率更高。

到了這里,關(guān)于MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MySQL為什么要使用B+樹做索引?MySQL索引存儲模型推演,B+樹在MySQL的落地形式

    MySQL為什么要使用B+樹做索引?MySQL索引存儲模型推演,B+樹在MySQL的落地形式

    user_innodb這張表里有4個字段,id,name,gender,phone。 當(dāng)這張表有500萬條數(shù)據(jù),在沒有索引的name字段上執(zhí)行一條where查詢: 如果name字段上有索引呢?我們在name字段上面創(chuàng)建一個索引,再來執(zhí)行一下查詢: 我們再來執(zhí)行一下select語句。 我們會發(fā)現(xiàn),有索引的查詢和沒有索引的

    2024年02月16日
    瀏覽(30)
  • MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上

    MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上

    Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上 前面我們講解了B+Tree的索引結(jié)構(gòu),也詳細(xì)講解下 left Join的底層驅(qū)動表 選擇原理,那么今天我們來看看到底如何用以及如何建立索引和索引優(yōu)化 開始之前我們先提一個問題, 為什么索引要建立在被驅(qū)動表上 ? 1.建表及測試數(shù)據(jù) 我們先

    2024年02月08日
    瀏覽(43)
  • MySQL 索引為什么使用 B+ 樹,而不使用紅黑樹 / B 樹 ?

    MySQL 索引為什么使用 B+ 樹,而不使用紅黑樹 / B 樹 ?

    首先 B 樹和 B+ 樹 都是多叉搜索樹,然后我們先來觀察一下 B+ 樹和 B 樹的數(shù)據(jù)結(jié)構(gòu): B+ 樹的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) ?B 樹的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) 【B+ 樹相較于 B 樹的優(yōu)勢】 1. IO 次數(shù)更少(查詢效率更高) ????????B+ 樹的非葉子節(jié)點(diǎn)不存放實(shí)際的數(shù)據(jù),僅存放索引,因此數(shù)據(jù)量相同的情況

    2024年02月12日
    瀏覽(25)
  • MySQL索引為什么選擇B+樹,而不是二叉樹、紅黑樹、B樹?

    MySQL索引為什么選擇B+樹,而不是二叉樹、紅黑樹、B樹?

    二叉樹是一種二分查找樹,有很好的查找性能,相當(dāng)于二分查找。 二叉樹的非葉子節(jié)值大于左邊子節(jié)點(diǎn)、小于右邊子節(jié)點(diǎn)。 原因: 但是當(dāng)N比較大的時候,樹的深度比較高。數(shù)據(jù)查詢的時間主要依賴于磁盤IO的次數(shù),二叉樹深度越大,查找的次數(shù)越多,性能越差。 最壞的情況

    2024年04月25日
    瀏覽(29)
  • 現(xiàn)代軟件為什么要采用微服架構(gòu)

    現(xiàn)代軟件采用微服務(wù)架構(gòu)是為了解決傳統(tǒng)單體架構(gòu)在開發(fā)、部署和維護(hù)大型應(yīng)用時面臨的一系列問題。以下是采用微服務(wù)架構(gòu)的主要優(yōu)勢: 1. **模塊化和組件化**:微服務(wù)通過將應(yīng)用拆分為一系列小型、松耦合的服務(wù)來提高模塊化水平。每個服務(wù)都是圍繞特定的業(yè)務(wù)功能構(gòu)建

    2024年04月26日
    瀏覽(19)
  • 為什么C#要采用頂級語句?

    為什么C#要采用頂級語句?

    前言 有群友問:為什么C#要采用頂級語句? .NET6發(fā)布后,C#10莫名引入了頂級語句,這是一種簡化代碼結(jié)構(gòu)的語言特性。在此之前,C#程序必須包含一個入口點(diǎn),通常是Main方法,然后在該方法中編寫主要的程序邏輯。而使用頂級語句后,可以直接在文件的頂部編寫執(zhí)行代碼,而

    2024年02月01日
    瀏覽(22)
  • 為什么 OpenAI 團(tuán)隊采用 Python 開發(fā)他們的后端服務(wù)?

    為什么 OpenAI 團(tuán)隊采用 Python 開發(fā)他們的后端服務(wù)?

    Python,年齡可能比很多讀者都要大,但是它在更新快速的編程界卻一直表現(xiàn)出色,甚至有人把它比作是編程界的《葵花寶典》,只是Python的速成之法相較《葵花寶典》有過之而無不及。 Python簡潔,高效的特點(diǎn),大大提升了程序員的編碼速度,極大的提高了程序員的辦公效率,

    2024年02月02日
    瀏覽(28)
  • 炫云為什么要采用讓人看不懂的GHZ計費(fèi)?

    炫云為什么要采用讓人看不懂的GHZ計費(fèi)?

    很多人看到炫云GHZ計費(fèi)都表示看不懂,覺得麻煩,沒有按核數(shù)、按線程或者按分鐘計費(fèi)簡單易懂,甚至還被某些同行經(jīng)常拿來攻擊。哪為什么炫云還堅持用GHZ計費(fèi)呢?哪是因?yàn)槭褂肎HZ計費(fèi)更加公平、透明,且具有硬件無關(guān)性。今天就來和大家詳細(xì)說說炫云為什么要用GHZ計費(fèi)。

    2024年02月05日
    瀏覽(27)
  • 入門ElasticSearch :為什么選擇ES作為搜索引擎?

    隨著數(shù)據(jù)量的不斷增長,搜索和分析大規(guī)模數(shù)據(jù)集變得越來越重要。傳統(tǒng)數(shù)據(jù)庫在面對這種需求時往往表現(xiàn)不佳,這時候就需要一種專門用于搜索和分析的引擎。ElasticSearch (簡稱ES)就是這樣一款強(qiáng)大的搜索引擎,它具有許多優(yōu)勢,使得它成為許多企業(yè)和開發(fā)者的首選。 簡

    2024年02月09日
    瀏覽(23)
  • 為什么要去了解javascript的底層?

    JavaScript的基本數(shù)據(jù)類型包括:數(shù)字、字符串、布爾值、null、undefined。其中,數(shù)字類型可以是整數(shù)或浮點(diǎn)數(shù),字符串類型用單引號或雙引號表示,布爾值只有true和false兩個取值,null表示一個空值,undefined表示一個未定義的值。 在JavaScript底層實(shí)現(xiàn)中,每種數(shù)據(jù)類型都有相應(yīng)的

    2024年02月01日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包