日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 联合索 B 树_MySQL 索引与 B+ 树

發(fā)布時間:2025/3/21 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 联合索 B 树_MySQL 索引与 B+ 树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MySQL 索引與 B+ 樹

B+ 樹

MySQL Innodb 存儲引擎是使用 B+ 樹來組織索引的。在介紹 B+ 樹以前,先認識一下什么是 B 樹,B 樹是平衡二叉樹,與一般的二叉查找樹不同,平衡二叉樹首先滿足二叉查找樹的定義(左子樹的鍵小于根的鍵,右子樹的鍵大于根的鍵),其次必須滿足任何節(jié)點的兩個子樹的高度最大差為 1。B 樹的維護要求插入和更新節(jié)點時,通過 1 次或多次左旋和右旋來滿足平衡的條件。二叉查找樹是否平衡直接影響了查找需要比較的次數(shù)。

B+ 樹與普通的二叉樹不同,它的節(jié)點由多個關(guān)鍵字和指向子樹的指針組成,指向子樹的指針個數(shù)等于關(guān)鍵字個數(shù)加 1,這些子樹中關(guān)鍵字的范圍由它的父節(jié)點限定,真正的數(shù)據(jù)部分是存放在葉子節(jié)點中的。MySQL 中頁數(shù)據(jù)結(jié)構(gòu)就是這些葉子節(jié)點,每個葉子節(jié)點對應(yīng)了一個 Page,而 Page 的數(shù)據(jù)結(jié)構(gòu)中有 PAGE_PREV 和 PAGE_NEXT 兩個指針,因此這些葉子節(jié)點兩兩之間也是相互連接的。

B+ 樹的插入操作

由于 B+ 樹需要在插入后依然保證平衡,因此插入操作會涉及到頁的拆分操作。Index Page 指的是非葉子結(jié)點而 Leaf Page 指的是葉子節(jié)點。插入操作分為以下三種情況:

當(dāng) Index Page 和 Leaf Page 都不滿時,直接將記錄插入到葉子節(jié)點中。

當(dāng) Index Page 不滿,Leaf Page 滿時,先將節(jié)點放入對應(yīng) Page,以中間節(jié)點作為依據(jù),將 Page 拆分,然后將中間節(jié)點放入 Index Page 中,拆分后的左右記錄分別放在中間節(jié)點的左右兩邊。

當(dāng) Index Page 和 Leaf Page 都滿了,先拆分 Leaf Page,然后再拆分 Index Page,拆分 Index Page 的方法與拆分 Leaf Page 的方法一樣。

此處需要注意:為了在可能地情況下減少頁的拆分操作,B+ 樹提供了類似二叉平衡樹的旋轉(zhuǎn)操作。旋轉(zhuǎn)操作發(fā)生在 Leaf Page 已經(jīng)滿,但是其左右兄弟節(jié)點沒有滿的情況下。

B+ 樹的刪除操作

B+ 樹使用填充因子來控制樹的變化,即中間節(jié)點關(guān)鍵字的數(shù)量和葉子節(jié)點關(guān)鍵字的數(shù)量和最大值的比例關(guān)系。此處以填充因子為 50% 為例。小于填充因子即為小于總?cè)萘康囊话搿h除操作可以分為以下三種情況:

當(dāng) Leaf Page 關(guān)鍵字個數(shù)和 Index Page 節(jié)點關(guān)鍵字的個數(shù)都不小于填充因子時,直接將記錄從 Leaf Node 中刪除,如果該節(jié)點為 Index Page 節(jié)點,那么將 Index Page 節(jié)點替換為其右節(jié)點。

當(dāng) Leaf Page 關(guān)鍵字個數(shù)小于而 Index Page 不小于填充因子時,將 Leaf Page 節(jié)點和其兄弟節(jié)點合并,同時更新 Index Page 節(jié)點。

當(dāng) Leaf Page 關(guān)鍵字個數(shù)和 Index Page 節(jié)點關(guān)鍵字的個數(shù)都小于填充因子時,在情況 2 的基礎(chǔ)上還需要合并 Index Page 節(jié)點。

索引

索引在 MySQL 中就是使用 B+ 樹實現(xiàn)的,不同索引之間形成的 B+ 樹也是不同的。

聚集索引

聚集索引就是根據(jù)主鍵來構(gòu)造 B+ 樹,葉子節(jié)點存放對應(yīng)頁的行記錄。

輔助索引(非聚集索引)

輔助索引就是使用非主鍵構(gòu)造的 B+ 樹,葉子節(jié)點存放的是對應(yīng)的鍵值以及相應(yīng)的聚集索引鍵。通過輔助索引來搜索一般是兩級的,第一級找到鍵值對應(yīng)的聚集索引鍵,第二級是根據(jù)聚集索引鍵尋找行記錄。

聯(lián)合索引

聯(lián)合索引就是對表上的多個列進行索引,這樣構(gòu)造的 B+ 樹的 Index Node 和 Page Node 包含多個鍵。

索引覆蓋

在聯(lián)合索引的情況去搜索行記錄,假設(shè)需要的行記錄的列正好包含在聯(lián)合索引中,那么此時結(jié)果將可以直接從聯(lián)合索引中得到,省去了從聚集索引中搜索,由于不包含整行的記錄所以可以大大減少 IO。

不使用索引的情況

當(dāng)查詢滿足條件的行的所有列時,MySQL 不使用輔助索引,而是直接使用聚集索引。原因是即使使用了輔助索引,還是必須通過葉子節(jié)點中的目錄進行聚集索引的查找,才能得到完整的信息,那么直接從聚集索引中獲取即可。

總結(jié)

以上是生活随笔為你收集整理的mysql 联合索 B 树_MySQL 索引与 B+ 树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。