MySQL:B+樹索引

InnoDB索引方案

為了使用二分法快速定位具體的目錄項,假設所有目錄項都可以在物理存儲器上連續存儲,有以下問題:

  • InnoDB使用頁為管理存儲空間的基本單位,最多只能保證16KB的連續存儲空間,記錄數據量多可能需要非常大的連續存儲空間才能放下所有目錄項
  • 增刪操作,如果把某頁的記錄都刪除,則該頁及目錄項都沒有存在的必要,如果要把后面的目錄項都向前移,牽一發而動全身;如果不移動作為冗余放在目錄項列表,浪費存儲空間
    復用存儲用戶記錄的數據頁來存儲目錄項,record_type=1標志目錄項記錄
    在這里插入圖片描述

目錄項記錄和普通用戶記錄的不同點

  • 目錄項記錄record_type為1,普通用戶記錄的record_type為0
  • 目錄項記錄只有主鍵值和頁的編號兩個列,普通用戶記錄的列由用戶自己定義,可能包含多列,還有InnoDB自己添加的隱藏列
  • 只有目錄項記錄的min_rec_flag屬性為1,普通用戶記錄的min_rec_flag屬性都是0
    在這里插入圖片描述

在這里插入圖片描述

如果存儲目錄項的頁也很多,則為這些存儲目錄項記錄的頁再生成一個更高級的目錄
真正的用戶記錄都存放在B+樹🌲的葉子節點上【第0層】
Page Header部分PAGE_LEVEL屬性代表這個數據頁作為節點在B+樹中的層級

聚簇索引

B+樹本身就是一個目錄/一個索引,有以下兩個特點:

  • 使用記錄主鍵值的大小進行記錄和頁的排序
    • 頁【包括葉子節點和內節點】內的記錄按照主鍵的大小排序排成一個單向鏈表,頁內的記錄被劃分成若干個組,每個組中主鍵值最大的記錄在頁內的偏移量會被當作槽依次放在頁目錄項中,可以在頁目錄中通過二分法快速定位到主鍵列等于某值的記錄
    • 各個存放用戶記錄的頁也是根據頁中用戶記錄的主鍵大小順序排成一個雙向鏈表
    • 存放目錄項記錄的頁分為不同的層級,在同一層級中的頁也是根據頁中目錄項記錄的主鍵大小排序排成一個雙向鏈表
  • B+樹的葉子節點存儲的是完整的用戶記錄【所有列的值,包括隱藏列】
    在InnoDB存儲引擎中,聚簇索引就是數據的存儲方式【索引即數據,數據即索引】

二級索引

聚簇索引只能在搜索條件是主鍵值時才能發揮作用【B+樹中的數據都是按照主鍵進行排序】
多建幾顆B+樹,不同的B+樹中的數據采用不同的排序規則
在這里插入圖片描述

與聚簇索引的不同:

  • 使用記錄c2列的大小進行記錄和頁的排序
    • 頁【包括葉子節點和內節點】內的記錄是按照c2列的大小順序排成的一個單向鏈表,頁內的記錄被劃分成若干個組,每個組中c2列值最大的記錄在頁內的偏移量會被當作槽一次存放在頁目錄中
    • 各個存放用戶記錄的頁也是根據頁中記錄的c2列大小順序排成的一個雙向鏈表
    • 存放目錄項記錄的頁分為不同的層級,在同一層級中的頁也是根據頁中目錄項記錄的c2列大小順序排成一個雙向鏈表
  • B+樹的葉子節點存儲的不是完整的用戶記錄,而只是c2列+主鍵這兩個列的值
  • 目錄項記錄中不再是主鍵+頁號的搭配,變成了c2列+頁號的搭配
    C2列并沒有唯一性約束,也就是說滿足搜索條件c2=4的記錄可能有多條,只需要在該B+樹的葉子節點處定位到第一條滿足搜索條件c2=4的記錄,然后沿著由記錄組成的單向鏈表一直向后掃描即可**【頁內的記錄是按照c2列的大小順序排成的一個單向鏈表】,各個葉子節點組成了雙向鏈表**,搜索完了本頁記錄后可以跳到下一頁面中第一條記錄繼續向后掃描
    查找c2=4記錄的過程:
  1. 確定第一條符合條件的目錄項記錄所在的頁【定位到頁42(2<4<9)】
  2. 通過第一條符合條件的目錄項記錄所在的頁面確定第一條符合條件的用戶記錄所在的頁【定位到第一條符合c2=4的用戶記錄所在頁為34/35(2<4≤ 4)】
  3. 在真正存儲第一條符合條件的用戶記錄的頁中定位到具體的記錄【如果在頁34定位到第一條就不需要再到頁35定位第一條記錄】
  4. 這個B+樹只記錄了c2和主鍵兩個列,在定位到第一條符合條件的用戶記錄后,需要根據該記錄中的主鍵信息到聚簇索引中查找到完整的用戶記錄,這個通過攜帶主鍵信息到聚簇索引中重新定位完整記錄的過程也稱為回表,然后再返回到這顆B+樹葉子節點處沿單向鏈表繼續向后搜索其他滿足條件的記錄【找到一條就去聚簇索引找到完整記錄】
    因為需要回表才能獲取完整的記錄,這種B+樹也稱為二級索引/輔助索引

聯合索引/復合索引/多列索引

可以同時以多個列的大小作為排序規則,即同時為多個列建立索引
在這里插入圖片描述

  • 每條目錄項記錄都由c2列、c3列、頁號這三部分組成,記錄先按c2列的值進行排序,c2相同的情況下再按照c3列的值進行排序
  • B+樹葉子節點處的用戶記錄由c2列、c3列和主鍵c1組成
    本質上也是一個二級索引

InnoDB中B+樹索引的注意事項

  1. 根頁面萬年不動窩【頁號不再改變】【存簇索引根節點在某個頁面,數據字典中的一項信息】
    1. 每當為某個表創建B+樹索引【聚簇索引默認存在】時,就會為這個索引創建一個根節點頁面,最開始表中沒有數據的時候,每個B+樹索引對應的根節點中既沒有用戶記錄也沒有目錄項記錄
    2. 向表中插入用戶記錄時,先把用戶記錄存儲到這個根節點中
    3. 在根節點中可用空間用完時繼續插入記錄,1??將根節點中所有記錄復制到一個新分配的頁a中,2??對這個新頁進行頁分裂操作,3??得到另一個新頁b,新插入的記錄會根據鍵值【主鍵值/二級索引對應的索引列值】的大小分配到頁a/頁b中,根節點升級為存儲目錄項記錄的頁,需要把頁a和頁b對應的目錄項記錄插入到根節點中【由空葉子節點形成樹的過程】
  2. 內節點中目錄項記錄的唯一性
    1. 目錄項記錄的內容是索引列加頁號的搭配,但對于二級索引來說不夠嚴謹,為了讓新插入的記錄找到在哪個頁,需要保證B+樹同一層內節點的目錄項記錄除頁號字段以外是唯一的【二級索引內節點的目錄項記錄的內容由:索引列的值、主鍵值、頁號構成】

    2. 在這里插入圖片描述

    3. 圖6-16如果插入列值為1的記錄,則該記錄會找不到該往頁4插還是頁5

    4. 如圖6-17,先把新記錄的列值與頁3各目錄項記錄的列值比較,如果列值相同,可以接著比較主鍵,B+樹同一層中不同目錄項記錄的列值+主鍵的值肯定不同,最后肯定能定位到唯一一條目錄項記錄

    5. 對二級索引記錄來說,先按二級索引列的值進行排序,如果列值相同的情況下,再按主鍵值排序,為c2列建立索引相當于為(c2,c1)列建立一個聯合索引

    6. 對于唯一二級索引【當為某列或列組合聲明UNIQUE屬性時,便會為這個列或列組合建立唯一二級索引】來說,也可能會出現多條記錄鍵值相同的情況【聲明為UNIQUE屬性的列可能存儲多個NULL值;MVCC服務】,唯一二級索引的內節點的目錄項記錄也會包含記錄的主鍵值

  3. 一個頁面至少容納2條記錄
    1. InnoDB一個數據頁至少可以存放2條記錄,如果只能存放一條則目錄層級會非常多,最后葉子節點也只有一條記錄,效率大打折扣
    2. 如果B+樹葉子節點只存儲一條記錄,內節點存儲多條記錄也是可以發揮B+樹作用的,但是為了避免B+樹層級增長過高,InnoDB要求所有數據頁都至少可以容納兩條記錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77043.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

THCON 2025

Crypto OTPas_ouf 用10個字符異或加密的jpg圖片&#xff0c;通過頭得到key再恢復原圖 Mammoths Personnal Slot Machine 梅森旋轉恢復 from pwn import * from randcrack import RandCrack from tqdm import trange context.log_level errorp remote(74.234.198.209, 33…

3.8 字符串的常用函數

重點&#xff1a;字符串的常用函數 #1.測試轉換大小寫 lower:大寫->小寫 upper&#xff1a;小寫->大寫 swapcase&#xff1a;自動將大寫轉小寫小寫轉大寫 print("ABC".lower()) #abcprint("abc".upper()) #ABCprint…

Docker:SkyWalking 鏈路追蹤的技術指南

1、簡述 Apache SkyWalking 是一個開源的 APM(應用性能監控)工具,能夠實現分布式系統的全鏈路監控、性能分析以及服務依賴關系分析。SkyWalking 支持多種語言的探針,提供強大的可視化監控和分析能力,是微服務架構下性能調優和問題排查的利器。 樣例代碼: https://gitee.…

[Lc] 最長公共子序列 | Fenwick Tree(樹狀數組):處理動態前綴和

目錄 LCR 095. 最長公共子序列 題解 Fenwick Tree&#xff08;樹狀數組&#xff09;&#xff1a;處理動態前綴和 一、問題背景&#xff1a;當傳統方法遇到瓶頸 二、Fenwick Tree核心設計 2.1 二進制索引的魔法 2.2 關鍵操作解析 更新操作&#xff08;O(log n)&#xff0…

python3.13.0環境安裝及python-docx庫安裝指南

1. Python環境安裝 1.1 Windows系統安裝Python 下載Python安裝包 ? 訪問Python官網 ? 點擊"Download Python 3.x.x"&#xff08;推薦使用3.8及以上版本&#xff09; 2. 運行安裝程序 ? 雙擊下載的安裝包 ? 重要&#xff1a;勾選"Add Python to environmen…

前端VUE框架理論與應用(4)

一、計算屬性 模板內的表達式非常便利,但是設計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。例如: <div id="example">{{ message.split().reverse().join() }}</div> 在這個地方,模板不再是簡單的聲明式邏輯。你…

MySQL:存儲函數和存儲過程

系列文章目錄 1.MySQL編程基礎 2.程序控制流語句 3.存儲過程 4.游標 5.嵌入式SQL 文章目錄 系列文章目錄前言一、程序控制流語句&#xff1a;二、存儲函數&#xff1a; 1.存儲函數的特點&#xff1a;2.存儲函數的定義&#xff1a;3.調用存儲函數 三、存儲過程&#xff1a;…

基礎貪心算法集合2(10題)

目錄 1.單調遞增的數字 2.壞了的計算器 3.合并區間 4.無重疊區間 5. 用最少數量的箭引爆氣球 6.整數替換 解法1&#xff1a;模擬記憶化搜索 解法2位運算貪心 7.俄羅斯套娃信封問題 補充.堆箱子 8.可被3整除的最大和 9.距離相等的條形碼 10.重構字符串 1.單調遞增的數字…

RaabitMQ 快速入門

&#x1f389;歡迎大家觀看AUGENSTERN_dc的文章(o゜▽゜)o☆?? &#x1f389;感謝各位讀者在百忙之中抽出時間來垂閱我的文章&#xff0c;我會盡我所能向的大家分享我的知識和經驗&#x1f4d6; &#x1f389;希望我們在一篇篇的文章中能夠共同進步&#xff01;&#xff01;&…

語音識別——根據聲波能量、VAD 和 頻譜分析實時輸出文字

SenseVoiceSmall網絡結構圖 ASR(語音識別)是將音頻信息轉化為文字的技術。在實時語音識別中,一個關鍵問題是:如何決定將采集的音頻數據輸入大模型的最佳時機?固定時間間隔顯然不夠靈活,太短可能導致頻繁調用模型,太長則會延遲文字輸出。有沒有更智能的方式?答案是肯定…

AI大模型如何重塑科研范式:從“假說驅動”到“數據涌現”

??個人主頁??:慌ZHANG-CSDN博客 ????期待您的關注 ???? 一、引言:科研進入“模型共研”時代 傳統科研范式通常以“假設→實驗→驗證→理論”的方式推進,這一經典路徑建立在人類的認知能力與邏輯推理基礎上。然而,隨著數據規模的爆炸式增長與知識系統的高度復雜…

使用Python寫入JSON、XML和YAML數據到Excel文件

在當今數據驅動的技術生態中&#xff0c;JSON、XML和YAML作為主流結構化數據格式&#xff0c;因其層次化表達能力和跨平臺兼容性&#xff0c;已成為系統間數據交換的通用載體。然而&#xff0c;當需要將這類半結構化數據轉化為具備直觀可視化、動態計算和協作共享特性的載體時&…

面試題:Eureka和Nocas的區別

Eureka 與 Nacos 核心區別對比 一、功能定位與核心能力 ?維度??Eureka??Nacos??核心功能?專注服務注冊與發現&#xff0c;無配置管理功能?:ml-citation{ref“1,3” data“citationList”}集成服務注冊、發現、配置管理、動態DNS等?:ml-citation{ref“1,3” data“c…

2025年4月15日 百度一面 面經

目錄 1. 代理相關 從靜態代理到動態代理 2. cglib可以代理被final修飾的類嗎,為什么 3. JVM 體系結構 4. 垃圾回收算法 5. 什么是注解 如何使用 底層原理 6. synchronized和reentrantlock 7. 講一下你項目中 redis的分布式鎖 與java自帶的鎖有啥區別 8. post 請求和 ge…

AI改變生活

AI改變生活 人工智能&#xff08;AI&#xff09;在我們生活中的應用越來越廣泛&#xff0c;深刻地改變了我們的工作和生活方式。以下是一些AI實際應用的實例&#xff0c;以及它們如何影響我們的日常生活。 1. 智能助手 智能助手如Siri、Alexa和Google Assistant等&#xff0…

信奧賽之c++基礎(取模運算與數位分離)

?? 數字拆解大冒險——取模運算與數位分離魔法課 ?? 第一章:糖果分裝術——取模運算 ?? 分糖果游戲 7顆糖每人分3顆: 每人得到:7 / 3 = 2顆剩余糖果:7 % 3 = 1顆(%就是取模符號) 就像把糖果裝袋后剩下的零散糖粒!?? 取模運算說明書 算式比喻結果10 % 310顆糖分…

揭秘大數據 | 21、軟件定義計算

老夫先將這個小系列的前兩篇內容鏈接奉上&#xff0c;方便感興趣的朋友一氣讀之。 揭秘大數據 | 19、軟件定義的世界-CSDN博客 揭秘大數據 | 20、軟件定義數據中心-CSDN博客 今天&#xff0c;書接上文&#xff0c;開聊軟件定義計算的那些事兒&#xff01; 虛擬化是軟件定義…

FPGA-DDS技術的波形發生器

1.實驗目的 1.1掌握直接數字頻率合成&#xff08;DDS&#xff09;的基本原理及其實現方法。 1.2在DE2-115 FPGA開發板上設計一個可調頻率的正弦波和方波發生器&#xff0c;頻率范圍10Hz~5MHz&#xff0c;最小分辨率小于1kHz。 1.3使用Quartus II進行仿真&#xff0c;并通過S…

LeetCode[541]反轉字符串Ⅱ

思路&#xff1a; 題目給我們加了幾個規則&#xff0c;剩余長度小于2k&#xff0c;大于等于k就反轉k個&#xff0c;小于k就全部反轉&#xff0c;我們按照這個邏輯來就行。 第一就是大于等于k就反轉k個&#xff0c;我們for循環肯定是i2k了&#xff0c;接下來就是判斷是否大于等于…

實現定長的內存池

池化技術 所謂的池化技術&#xff0c;就是程序預先向系統申請過量的資源&#xff0c;然后自己管理起來&#xff0c;以備不時之需。這個操作的價值就是&#xff0c;如果申請與釋放資源的開銷較大&#xff0c;提前申請資源并在使用后并不釋放而是重復利用&#xff0c;能夠提高程序…