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

淺析MySQL索引結(jié)構采用B+樹的問題

 更新時間:2022年06月21日 14:31:51   作者:Tom彈架構  
數(shù)據(jù)庫的存儲引擎都是采用B樹或者B+樹來實現(xiàn)索引的存儲,總體來說,我認為技術方案的選型,更多的要根據(jù)具體的業(yè)務場景來決定,并不一定是說B+樹就是最好的選擇,就像MongoDB里面采用B樹結(jié)構,本文介紹我對MySQL索引結(jié)構采用B+樹的理解

一位6年經(jīng)驗的小伙伴去字節(jié)面試的時候被問到這樣一個問題,為什么MySQL索引結(jié)構要采用B+樹?這位小伙伴從來就沒有思考過這個問題。只因為現(xiàn)在都這么卷,后面還特意查了很多資料,他也希望聽聽我的見解。

另外,我花了1個多星期把往期的面試題解析配套文檔準備好了,一共有10萬字,想獲取的小伙伴可以在我的煮葉簡介中找到。

1、B樹和B+樹

一般來說,數(shù)據(jù)庫的存儲引擎都是采用B樹或者B+樹來實現(xiàn)索引的存儲。首先來看B樹,如圖所示。

B樹是一種多路平衡樹,用這種存儲結(jié)構來存儲大量數(shù)據(jù),它的整個高度會相比二叉樹來說,會矮很多。

而對于數(shù)據(jù)庫而言,所有的數(shù)據(jù)都將會保存到磁盤上,而磁盤I/O的效率又比較低,特別是在隨機磁盤I/O的情況下效率更低。

所以 高度決定了磁盤I/O的次數(shù),磁盤I/O次數(shù)越少,對于性能的提升就越大,這也是為什么采用B樹作為索引存儲結(jié)構的原因,如圖所示。

而MySQL的InnoDB存儲引擎,它用了一種增強的B樹結(jié)構,也就是B+樹來作為索引和數(shù)據(jù)的存儲結(jié)構。

相比較于B樹結(jié)構來說,B+樹做了兩個方面的優(yōu)化,如圖所示。

1、B+樹的所有數(shù)據(jù)都存儲在葉子節(jié)點,非葉子節(jié)點只存儲索引。

2、葉子節(jié)點中的數(shù)據(jù)使用雙向鏈表的方式進行關聯(lián)。

2、原因分析

我認為,MySQL索引結(jié)構采用B+樹,有以下4個原因:

1、從磁盤I/O效率方面來看:B+樹的非葉子節(jié)點不存儲數(shù)據(jù),所以樹的每一層就能夠存儲更多的索引數(shù)量,也就是說,B+樹在層高相同的情況下,比B樹的存儲數(shù)據(jù)量更多,間接會減少磁盤I/O的次數(shù)。

2、從范圍查詢效率方面來看:在MySQL中,范圍查詢是一個比較常用的操作,而B+樹的所有存儲在葉子節(jié)點的數(shù)據(jù)使用了雙向鏈表來關聯(lián),所以B+樹在查詢的時候只需查兩個節(jié)點進行遍歷就行,而B樹需要獲取所有節(jié)點,因此,B+樹在范圍查詢上效率更高。

3、從全表掃描方面來看:因為,B+樹的葉子節(jié)點存儲所有數(shù)據(jù),所以B+樹的全局掃描能力更強一些,因為它只需要掃描葉子節(jié)點。而B樹需要遍歷整個樹。

4、從自增ID方面來看:基于B+樹的這樣一種數(shù)據(jù)結(jié)構,如果采用自增的整型數(shù)據(jù)作為主鍵,還能更好的避免增加數(shù)據(jù)的時候,帶來葉子節(jié)點分裂導致的大量運算的問題。

3、總結(jié)

總體來說,我認為技術方案的選型,更多的要根據(jù)具體的業(yè)務場景來決定,并不一定是說B+樹就是最好的選擇,就像MongoDB里面采用B樹結(jié)構,本質(zhì)上來說,其實是關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫的差異。

以上就是我對為什么MySQL索引結(jié)構采用B+樹 的理解。

到此這篇關于淺析MySQL索引結(jié)構采用B+樹的問題的文章就介紹到這了,更多相關mysql 索引B+樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Linux系統(tǒng)中MySQL的常用操作命令

    Linux系統(tǒng)中MySQL的常用操作命令

    本文給大家匯總介紹了下載Linux系統(tǒng)中操作mysql的一些常用的命令,非常實用,有需要的小伙伴可以參考下
    2018-02-02
  • mysql添加索引方法詳解(Navicat可視化加索引與sql語句加索引)

    mysql添加索引方法詳解(Navicat可視化加索引與sql語句加索引)

    索引用來快速地尋找那些具有特定值的記錄,如果沒有索引,執(zhí)行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄,表里面的記錄數(shù)量越多,代價就越高,下面這篇文章主要給大家介紹了關于mysql添加索引的相關資料,需要的朋友可以參考下
    2022-11-11
  • mybatis+mysql 使用存儲過程生成流水號的實現(xiàn)代碼

    mybatis+mysql 使用存儲過程生成流水號的實現(xiàn)代碼

    這篇文章主要介紹了mybatis+mysql 使用存儲過程生成流水號的實現(xiàn)代碼,需要的朋友可以參考下
    2018-01-01
  • Mysql深入探索之Explain執(zhí)行計劃詳析

    Mysql深入探索之Explain執(zhí)行計劃詳析

    這篇文章主要給大家介紹了關于Mysql深入探索之Explain執(zhí)行計劃的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 教你使用MySQL Shell連接數(shù)據(jù)庫的方法

    教你使用MySQL Shell連接數(shù)據(jù)庫的方法

    在有些情況下我們需要使用命令行方式連接MySQL數(shù)據(jù)庫,這時可以使用MySQL官方提供的命令行工具MySQL Shell,今天通過本文給大家介紹下mysql Shell連接數(shù)據(jù)庫的方法,感興趣的朋友一起看看吧
    2022-04-04
  • Mysql創(chuàng)建視圖中文亂碼如何修改docker里的配置

    Mysql創(chuàng)建視圖中文亂碼如何修改docker里的配置

    這篇文章主要介紹了Mysql創(chuàng)建視圖中文亂碼如何修改docker里的配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10
  • Mysql生成數(shù)據(jù)字典的原理與實例

    Mysql生成數(shù)據(jù)字典的原理與實例

    數(shù)據(jù)字典是一名DBA需要維護的重要內(nèi)容,有人喜歡用excel來維護,本人更喜歡直接在數(shù)據(jù)庫上進行維護,下面這篇文章主要給大家介紹了關于Mysql生成數(shù)據(jù)字典的原理與實例,以及導出MySQL的數(shù)據(jù)字典的方法,需要的朋友可以參考下
    2022-03-03
  • 使用MySQL唯一索引的注意事項及說明

    使用MySQL唯一索引的注意事項及說明

    這篇文章主要介紹了使用MySQL唯一索引的注意事項及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 基于mysql全文索引的深入理解

    基于mysql全文索引的深入理解

    本篇文章是對mysql全文索引進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL必備基礎之分組函數(shù) 聚合函數(shù) 分組查詢詳解

    MySQL必備基礎之分組函數(shù) 聚合函數(shù) 分組查詢詳解

    這篇文章主要介紹了MySQL分組函數(shù)、聚合函數(shù)、分組查詢,結(jié)合實例形式分析了MySQL查詢分組函數(shù)以及查詢聚合函數(shù)相關使用技巧,需要的朋友可以參考下
    2021-10-10

最新評論

佳木斯市| 隆回县| 肃宁县| 丽江市| 金沙县| 西乌珠穆沁旗| 诏安县| 疏勒县| 乌兰县| 聂荣县| 永修县| 龙门县| 六安市| 洛隆县| 巩留县| 治多县| 珲春市| 那坡县| 永和县| 华安县| 吴桥县| 云霄县| 夏津县| 宽甸| 分宜县| 宁远县| 灯塔市| 县级市| 天水市| 海盐县| 石景山区| 安远县| 和平区| 建阳市| 库伦旗| 岚皋县| 瓦房店市| 香港 | 丽江市| 三门峡市| 大竹县|