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

MySQL中B樹索引和B+樹索引的區(qū)別詳解

 更新時(shí)間:2022年03月02日 16:32:52   作者:小小茶花女  
這篇文章主要為大家詳細(xì)介紹了MySQL中B樹索引和B+樹索引的區(qū)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

如果用樹作為索引的數(shù)據(jù)結(jié)構(gòu),每查找一次數(shù)據(jù)就會(huì)從磁盤中讀取樹的一個(gè)節(jié)點(diǎn),也就是一頁,而二叉樹的每個(gè)節(jié)點(diǎn)只存儲(chǔ)一條數(shù)據(jù),并不能填滿一頁的存儲(chǔ)空間,那多余的存儲(chǔ)空間豈不是要浪費(fèi)了?為了解決二叉平衡搜索樹的這個(gè)弊端,我們應(yīng)該尋找一種單個(gè)節(jié)點(diǎn)可以存儲(chǔ)更多數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),也就是多路搜索樹。

1. 多路搜索樹

1、完全二叉樹高度:O(log2N),其中2為對數(shù),樹每層的節(jié)點(diǎn)數(shù);

2、完全M路搜索樹的高度:O(logmN),其中M為對數(shù),樹每層的節(jié)點(diǎn)數(shù);

3、M路搜索樹主要用于解決數(shù)據(jù)量大無法全部加載到內(nèi)存的數(shù)據(jù)存儲(chǔ)。通過增加每層節(jié)點(diǎn)的個(gè)數(shù)和在每個(gè)節(jié)點(diǎn)存放更多的數(shù)據(jù)來在一層中存放更多的數(shù)據(jù),從而降低樹的高度,在數(shù)據(jù)查找時(shí)減少磁盤訪問次數(shù)。

4、所以每層的節(jié)點(diǎn)數(shù)和每個(gè)節(jié)點(diǎn)包含的關(guān)鍵字越多,則樹的高度越矮。但是在每個(gè)節(jié)點(diǎn)確定數(shù)據(jù)就越慢,但是B樹關(guān)注的是磁盤性能瓶頸,所以在單個(gè)節(jié)點(diǎn)搜索數(shù)據(jù)的開銷可以忽略。

2. B樹-多路平衡搜索樹

B樹是一種M路搜索樹,B樹主要用于解決M路搜索樹的不平衡導(dǎo)致樹的高度變高,跟二叉樹退化為鏈表導(dǎo)致性能問題一樣。B樹通過對每層的節(jié)點(diǎn)進(jìn)行控制、調(diào)整,如節(jié)點(diǎn)分離,節(jié)點(diǎn)合并,一層滿時(shí)向上分裂父節(jié)點(diǎn)來增加新的層等操作來來保證該M路搜索樹的平衡。

M為B樹的階數(shù)或者說是路數(shù),在B樹中,每個(gè)節(jié)點(diǎn)都是一個(gè)磁盤塊(頁)。每個(gè)非葉子節(jié)點(diǎn)存放了關(guān)鍵字和指向兒子樹的指針,具體數(shù)量為:M階的B樹,每個(gè)非葉子節(jié)點(diǎn)存放了M-1個(gè)關(guān)鍵字和M個(gè)指向子樹的指針。如圖為5階B樹結(jié)構(gòu)的示意圖:

在這里插入圖片描述

3. B樹索引

首先創(chuàng)建一張user表:

create table user(
	id int,
	name varchar,
	primary key(id)
) ROW_FORMAT=COMPACT;

假如我們使用B樹對表中的用戶記錄建立索引:

在這里插入圖片描述

B樹的每個(gè)節(jié)點(diǎn)占用一個(gè)磁盤塊,磁盤塊也就是頁,從上圖可以看出,B樹相對于平衡二叉樹,每個(gè)節(jié)點(diǎn)存儲(chǔ)了更多的主鍵key和數(shù)據(jù)data,并且每個(gè)節(jié)點(diǎn)擁有了更多的子節(jié)點(diǎn),子節(jié)點(diǎn)的個(gè)數(shù)一般稱為階,上述圖中的B樹為3階B樹,高度也會(huì)降低。假如我們要查找id=28的用戶信息,那么查找流程如下:

1、根據(jù)根節(jié)點(diǎn)找到頁1,讀入內(nèi)存?!敬疟PI/O操作第1次】

2、比較鍵值28在區(qū)間(17,35),找到頁1的指針p2;

3、根據(jù)p2指針找到頁3,讀入內(nèi)存。【磁盤I/O操作第2次】

4、比較鍵值28在區(qū)間(26,35),找到頁3的指針p2。

5、根據(jù)p2指針找到頁8,讀入內(nèi)存?!敬疟PI/O操作第3次】

6、在頁8中的鍵值列表中找到鍵值28,鍵值對應(yīng)的用戶信息為(28,po);

B-Tree相對于AVLTree縮減了節(jié)點(diǎn)個(gè)數(shù),使每次磁盤I/O取到內(nèi)存的數(shù)據(jù)都發(fā)揮了作用,從而提高了查詢效率。

4. B+樹索引

B+Tree是在B-Tree基礎(chǔ)上的一種優(yōu)化,使其更適合實(shí)現(xiàn)外存儲(chǔ)索引結(jié)構(gòu),B+樹的性質(zhì):

1、非葉子節(jié)點(diǎn)的子樹指針與關(guān)鍵字個(gè)數(shù)相同;

2、為所有葉子節(jié)點(diǎn)增加一個(gè)鏈指針;

3、所有關(guān)鍵字都在葉子節(jié)點(diǎn)出現(xiàn), 且鏈表中的關(guān)鍵字恰好是有序的;

4、非葉子節(jié)點(diǎn)相當(dāng)于是葉子節(jié)點(diǎn)的索引,葉子節(jié)點(diǎn)相當(dāng)于是存儲(chǔ)(關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層;

InnoDB存儲(chǔ)引擎就是用B+Tree實(shí)現(xiàn)其索引結(jié)構(gòu)。

從上一節(jié)中的B-Tree結(jié)構(gòu)圖中可以看到每個(gè)節(jié)點(diǎn)中不僅包含數(shù)據(jù)的key值,還有data值。而每一個(gè)頁的存儲(chǔ)空間是有限的,如果data數(shù)據(jù)較大時(shí)將會(huì)導(dǎo)致每個(gè)節(jié)點(diǎn)(即一個(gè)頁)能存儲(chǔ)的key的數(shù)量很小,當(dāng)存儲(chǔ)的數(shù)據(jù)量很大時(shí)同樣會(huì)導(dǎo)致B-Tree的深度較大,增大查詢時(shí)的磁盤I/O次數(shù),進(jìn)而影響查詢效率。在B+Tree中,所有數(shù)據(jù)記錄節(jié)點(diǎn)都是按照鍵值大小順序存放在同一層的葉子節(jié)點(diǎn)上,而非葉子節(jié)點(diǎn)上只存儲(chǔ)key值信息,這樣可以大大加大每個(gè)節(jié)點(diǎn)存儲(chǔ)的key值數(shù)量,降低B+Tree的高度。

B+Tree相對于B-Tree有幾點(diǎn)不同:

1、非葉子節(jié)點(diǎn)只存儲(chǔ)鍵值信息和指向子節(jié)點(diǎn)頁號的指針;

2、所有葉子節(jié)點(diǎn)之間都有一個(gè)鏈指針;

3、數(shù)據(jù)記錄都存放在葉子節(jié)點(diǎn)中;

在這里插入圖片描述

根據(jù)上圖我們來看下 B+ 樹和 B 樹有什么不同:

(1) B+ 樹非葉子節(jié)點(diǎn)上是不存儲(chǔ)數(shù)據(jù)的,僅存儲(chǔ)鍵值,而 B 樹節(jié)點(diǎn)中不僅存儲(chǔ)鍵值,也會(huì)存儲(chǔ)數(shù)據(jù)。

頁的大小是固定的,InnoDB 中頁的默認(rèn)大小是 16KB。如果不存儲(chǔ)數(shù)據(jù),那么就會(huì)存儲(chǔ)更多的鍵值,相應(yīng)的樹的階數(shù)就會(huì)更大,樹就會(huì)更矮更胖,如此一來我們查找數(shù)據(jù)進(jìn)行磁盤的 IO 次數(shù)又會(huì)再次減少,數(shù)據(jù)查詢的效率也會(huì)更快。

另外,如果我們的 B+ 樹一個(gè)節(jié)點(diǎn)可以存儲(chǔ) 1000 個(gè)鍵值,那么 3 層 B+ 樹可以存儲(chǔ) 1000×1000×1000=10 億個(gè)數(shù)據(jù)。一般根節(jié)點(diǎn)是常駐內(nèi)存的(第一次檢索根節(jié)點(diǎn)不用讀取磁盤),所以一般我們查找 10 億數(shù)據(jù),只需要 2 次磁盤 IO。

(2) B+ 樹索引的所有數(shù)據(jù)均存儲(chǔ)在葉子節(jié)點(diǎn),而且數(shù)據(jù)是按照順序排列的。

B+ 樹中各個(gè)頁之間是通過雙向鏈表連接的,葉子節(jié)點(diǎn)中的數(shù)據(jù)是通過單向鏈表連接的,通過這種方式可以找到表中的所有數(shù)據(jù)。B+ 樹使得范圍查找,排序查找,分組查找以及去重查找變得異常簡單。而 B 樹因?yàn)閿?shù)據(jù)分散在各個(gè)節(jié)點(diǎn),要實(shí)現(xiàn)這一點(diǎn)是很不容易的。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • mysql索引最左原則實(shí)例代碼

    mysql索引最左原則實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于mysql索引最左原則的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • MySQL數(shù)據(jù)庫本地事務(wù)原理解析

    MySQL數(shù)據(jù)庫本地事務(wù)原理解析

    事務(wù)是數(shù)據(jù)庫系統(tǒng)中的重要概念,了解這一律念是以正確的方式開發(fā)和數(shù)據(jù)庫交互的應(yīng)用程序的前提,今天通過本文給大家介紹MySQL數(shù)據(jù)庫本地事務(wù)原理解析,感興趣的朋友一起看看吧
    2022-01-01
  • mysql下修改engine引擎的方法

    mysql下修改engine引擎的方法

    修改mysql的引擎為INNODB,可以使用外鍵,事務(wù)等功能,性能高。
    2011-08-08
  • linux CentOS6.5 yum安裝mysql5.6

    linux CentOS6.5 yum安裝mysql5.6

    這篇文章主要為大家詳細(xì)介紹了linux CentOS6.5 yum安裝mysql5.6的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 在IntelliJ IDEA中使用Java連接MySQL數(shù)據(jù)庫的方法詳解

    在IntelliJ IDEA中使用Java連接MySQL數(shù)據(jù)庫的方法詳解

    這篇文章主要介紹了在IntelliJ IDEA中使用Java連接MySQL數(shù)據(jù)庫的方法詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • MySQL中slave監(jiān)控的延遲情況分析

    MySQL中slave監(jiān)控的延遲情況分析

    這篇文章主要介紹了MySQL中slave監(jiān)控的延遲情況分析,主要針對MySQL的復(fù)制環(huán)境情況下,需要的朋友可以參考下
    2015-05-05
  • 體驗(yàn)MySQL5.6.25并處理所遇到的問題

    體驗(yàn)MySQL5.6.25并處理所遇到的問題

    本文給大家分享的是將mysql升級到5.6.25版本后所遇到的2個(gè)問題的處理解決辦法,有需要的小伙伴可以參考下。
    2015-07-07
  • MySQL億級大表安全添加字段的三種方案

    MySQL億級大表安全添加字段的三種方案

    面對?1.35億條數(shù)據(jù)?的?MySQL?表添加字段,傳統(tǒng)?ALTER?TABLE?可能導(dǎo)致長時(shí)間鎖表,嚴(yán)重影響業(yè)務(wù),本文將提供一套完整的?零停機(jī)方案,涵蓋?Online?DDL?優(yōu)化、專業(yè)工具使用?和?Java?應(yīng)用層配合策略,需要的朋友可以參考下
    2025-03-03
  • MySQL中explain使用快速查詢手冊

    MySQL中explain使用快速查詢手冊

    我們會(huì)開慢查詢?nèi)ビ涗浺恍﹫?zhí)行時(shí)間比較久的SQL語句,找出這些SQL語句并不意味著完事了,會(huì)用到explain這個(gè)命令來查看一個(gè)這些SQL語句的執(zhí)行計(jì)劃,查看該SQL語句有沒有使用索引,下面這篇文章主要介紹了關(guān)于MySQL中explain使用快速查詢手冊的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 淺談MySQL8和MySQL5.7在自增計(jì)數(shù)上的區(qū)別

    淺談MySQL8和MySQL5.7在自增計(jì)數(shù)上的區(qū)別

    MySQL數(shù)據(jù)庫是一款非常流行的開源數(shù)據(jù)庫,其版本升級迅速,在使用過程中也發(fā)現(xiàn)了不同版本之間存在著一些區(qū)別,本文主要介紹了MySQL8和MySQL5.7在自增計(jì)數(shù)上的區(qū)別,感興趣的可以了解一下
    2023-10-10

最新評論

霍山县| 巴林左旗| 三亚市| 西盟| 潜山县| 汝南县| 共和县| 渭源县| 栖霞市| 平和县| 宜春市| 永修县| 田林县| 崇信县| 淮阳县| 镇坪县| 白银市| 黑河市| 岢岚县| 隆化县| 大理市| 扶绥县| 大石桥市| 交口县| 板桥市| 元氏县| 荔波县| 新田县| 富锦市| 尼木县| 密山市| 德昌县| 宝丰县| 巴彦淖尔市| 富平县| 晋中市| 梅州市| 明光市| 岑巩县| 金沙县| 乐山市|