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

一文了解mysql索引的數(shù)據(jù)結(jié)構(gòu)為什么要用B+樹

 更新時間:2022年04月25日 14:32:35   作者:YuShiwen?  
這篇文章主要介紹了一文了解mysql索引的數(shù)據(jù)結(jié)構(gòu)為什么用B+樹,在節(jié)點中存儲某段數(shù)據(jù)的首地址,并且B+樹的葉子節(jié)點用了一個鏈表串聯(lián)起來,便于范圍查找,下文利用各種索引的數(shù)據(jù)結(jié)構(gòu)的方法與B+樹做對比,看看它的優(yōu)勢到底是什么,感興趣的小伙伴可以參考一下

前提: 以下的一些數(shù)據(jù)結(jié)構(gòu)大家需提前知道,否則看起來會比較有困難,大家也可以按照本文所提到的知識點去主動查閱學(xué)習(xí)。

1. Hash表?No

因考慮到在數(shù)據(jù)檢索的過程中經(jīng)常會有范圍的查詢(如下),而hash表不能提供這種功能。

SELECT * FROM hero WHERE age>5 AND age<20;

使用哈希算法實現(xiàn)的索引雖然可以做到快速檢索數(shù)據(jù),但是沒辦法做數(shù)據(jù)高效范圍查找,因此哈希索引是不適合作為 Mysql 的底層索引的數(shù)據(jù)結(jié)構(gòu)。

2. 二叉查找樹(BST)?No

二叉查找樹(Binary Search Tree)雖然可以達到范圍搜索,但是在樹的插入過程中,如果插入的數(shù)據(jù)本來就是有順序的,那么就會形成一條鏈(如下),它的最壞情況是O(n)。 

3. 紅黑樹?No

紅黑樹雖然看似達到了平衡狀態(tài),但是也會有極端情況存在,和上述BST樹一樣,雖然不會成為鏈狀,但是紅黑樹會存在右傾的現(xiàn)象。 

在數(shù)據(jù)庫中的基本主鍵自增操作,主鍵一般都是數(shù)百萬數(shù)千萬的,如果紅黑樹存在這種問題,對于查找性能而言也是巨大的消耗,我們數(shù)據(jù)庫不可能忍受這種無意義的等待的。

4. 平衡二叉樹(AVL)?差那么二點意思

平衡二叉樹,英文翻譯為Balanced Binary Tree,為啥叫AVL呢? AVL 是大學(xué)教授G.M. Adelson-VelskyE.M. Landis 名稱的縮寫,他們提出的平衡二叉樹的概念,為了紀(jì)念他們,將平衡二叉樹稱為 AVL樹。

AVL樹本質(zhì)上是一顆二叉查找樹,但是它又具有以下特點:

  • 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,
  • 左右兩個子樹也都是一棵平衡二叉樹。

它不存在紅黑樹這種右傾的現(xiàn)象,也具備數(shù)據(jù)高效范圍查找的能力,但是數(shù)據(jù)庫查詢數(shù)據(jù)的瓶頸在于磁盤的IO,樹節(jié)點在磁盤空間中存儲可能是不連續(xù)的,假設(shè)我們一次IO讀取一個樹的節(jié)點,此次讀入內(nèi)存的這頁中沒有其他樹的節(jié)點,那么每讀取一個樹的節(jié)點,就要進行一次IO,這是多么消耗時間啊,所以我們設(shè)計數(shù)據(jù)庫索引時需要首先考慮怎么盡可能減少磁盤 IO 的次數(shù)。 磁盤讀取依靠的是機械運動,分為尋道時間、旋轉(zhuǎn)延遲、傳輸時間三個部分,這三個部分耗時相加就是一次磁盤IO的時間;這個花費的時間成本是內(nèi)存訪問的十幾萬倍左右。 正是由于磁盤IO是非常昂貴的操作,所以計算機操作系統(tǒng)對此做了優(yōu)化:預(yù)讀;每一次IO時,不僅僅把當(dāng)前磁盤地址的數(shù)據(jù)加載到內(nèi)存,同時也把相鄰數(shù)據(jù)也加載到內(nèi)存緩沖區(qū)中。因為局部預(yù)讀原理說明:當(dāng)訪問一個地址數(shù)據(jù)的時候,與其相鄰的數(shù)據(jù)很快也會被訪問到。每次磁盤IO讀取的數(shù)據(jù)我們稱之為一頁(page)。一頁的大小與操作系統(tǒng)有關(guān),一般為4k或者8k。這也就意味著讀取一頁內(nèi)數(shù)據(jù)的時候,實際上發(fā)生了一次磁盤IO。

相關(guān)術(shù)語解釋:

扇區(qū)(sector):

  • 磁盤上的每個磁道被等分成多個弧段,這個弧段便稱作扇區(qū)(sector)。
  • 扇區(qū)是磁盤物理層面的名稱,它是實際發(fā)生讀寫的最底層。

磁盤塊(IO Block):

  • 操作系統(tǒng)不與扇區(qū)直接進行交互,因為一般情況下一個扇區(qū)是512byte,如果1T去用512byte進行劃分,那劃分的地址空間太多了,為了讓操作系統(tǒng)能夠?qū)ぶ返礁蟮牡刂房臻g,操作系統(tǒng)將相鄰的扇區(qū)組合在一起,形成一個塊,對塊進行管理。每個磁盤塊可以包括 2、4、8、16、32 或 64 個扇區(qū),這便是磁盤塊(IO Block)。
  • 磁盤塊是操作系統(tǒng)中出現(xiàn)的名稱,文件系統(tǒng)讀寫數(shù)據(jù)的最小單位,它同時也被叫做磁盤簇。

頁(page):

  • 頁是內(nèi)存中出現(xiàn)的名稱,它是內(nèi)存的最小存儲單位,頁的大小通常為磁盤塊大小的 2^n 倍。

5. B-tree(B-樹也稱B樹)?差那么一點意思

B樹是一種平衡的多叉樹,B樹相比于平衡二叉樹(AVL),它能夠在單個節(jié)點中存儲大量鍵,也降低了樹的高度,從而減少了IO的次數(shù)。 

B樹的節(jié)點中存儲的是數(shù)據(jù),單個節(jié)點存儲的內(nèi)容還是太少了,如何讓一個節(jié)點存儲的內(nèi)容更多呢?B+樹它來了。

6. B+樹

在節(jié)點中存儲某段數(shù)據(jù)的首地址,并且B+樹的葉子節(jié)點用了一個鏈表串聯(lián)起來,便于范圍查找。 

B+樹高度降低,減少了磁盤 IO。其次,B+樹的葉子節(jié)點是真正數(shù)據(jù)存儲的地方,葉子節(jié)點用了鏈表連接起來,這個鏈表本身就是有序的,在數(shù)據(jù)范圍查找時,更具備效率。因此 Mysql 的索引用的就是 B+樹,B+樹在查找效率、范圍查找中都有著非常不錯的性能。

到此這篇關(guān)于一文了解mysql索引的數(shù)據(jù)結(jié)構(gòu)為什么用B+樹的文章就介紹到這了,更多相關(guān)mysql B+樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL不推薦使用uuid或者雪花id作為主鍵的原因分析

    MySQL不推薦使用uuid或者雪花id作為主鍵的原因分析

    在數(shù)據(jù)庫設(shè)計中,選擇適當(dāng)?shù)闹麈I類型對于數(shù)據(jù)的存儲和查詢效率至關(guān)重要,在MySQL中,有些開發(fā)者傾向于使用UUID或者雪花ID作為主鍵,以確保數(shù)據(jù)的唯一性,本文將探討在MySQL中不推薦使用UUID或者雪花ID作為主鍵的原因,并與其他主鍵類型進行差異化對比
    2023-11-11
  • MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法詳解

    MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法詳解

    這篇文章主要介紹了MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • 詳解MySQL 數(shù)據(jù)分組

    詳解MySQL 數(shù)據(jù)分組

    這篇文章主要介紹了MySQL 數(shù)據(jù)分組的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-12-12
  • MySQL中VARCHAR與CHAR格式數(shù)據(jù)的區(qū)別

    MySQL中VARCHAR與CHAR格式數(shù)據(jù)的區(qū)別

    char是一種固定長度的類型,varchar則是一種可變長度的類型,那么他們具體使用過程中有什么區(qū)別嗎
    2015-09-09
  • MSSQL 添加字段說明

    MSSQL 添加字段說明

    MSSQL 字段添加方法。
    2009-05-05
  • MySQL和Redis實現(xiàn)二級緩存的方法詳解

    MySQL和Redis實現(xiàn)二級緩存的方法詳解

    這篇文章主要給大家介紹了關(guān)于MySQL和Redis實現(xiàn)二級緩存的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • mysql數(shù)據(jù)庫limit的四種用法小結(jié)

    mysql數(shù)據(jù)庫limit的四種用法小結(jié)

    mysql數(shù)據(jù)庫中l(wèi)imit子句可以被用于強制select語句返回指定的記錄數(shù),本文主要介紹了mysql數(shù)據(jù)庫limit的四種用法小結(jié),感興趣的可以了解一下
    2023-10-10
  • 淺談Mysql insert on duplicate key 死鎖問題定位與解決

    淺談Mysql insert on duplicate key 死鎖問

    本文介紹了在并發(fā)場景下的 insert on duplicate key update sql 出現(xiàn)的死鎖,經(jīng)過分析發(fā)現(xiàn)這種sql確實比較容易造成死鎖,這篇文章就從分析死鎖展開,到最終如何解決這樣的問題 分享相應(yīng)的思路,感興趣的可以了解一下
    2022-05-05
  • mysql數(shù)據(jù)庫分區(qū)的使用

    mysql數(shù)據(jù)庫分區(qū)的使用

    MySQL分區(qū)技術(shù)通過將大表分割成多個較小片段,提高查詢性能、管理效率和數(shù)據(jù)存儲效率,本文就來介紹一下mysql數(shù)據(jù)庫分區(qū)的使用,感興趣的可以了解一下
    2025-01-01
  • 實戰(zhàn)MySQL升級的最佳方法

    實戰(zhàn)MySQL升級的最佳方法

    這篇文章給大家從理論到實戰(zhàn)詳細分享了MySQL升級的最佳方法,有需要的朋友跟著學(xué)習(xí)操作下吧。
    2017-12-12

最新評論

大化| 昌平区| 岱山县| 潞西市| 丽水市| 新密市| 天门市| 鹤山市| 景泰县| 祁门县| 丰县| 潜山县| 惠来县| 竹北市| 兴安县| 泸定县| 永胜县| 昭通市| 泽普县| 恩施市| 鲁山县| 周宁县| 安吉县| 大荔县| 九龙坡区| 仲巴县| 金阳县| 牡丹江市| 阳高县| 拉孜县| 东台市| 黎平县| 通化市| 乐亭县| 武定县| 莒南县| 类乌齐县| 陆川县| 涞水县| 沈阳市| 德州市|