【戀上數據結構】MySQL的索引底層爲何使用 B+樹?

數據結構與算法筆記戀上數據結構筆記目錄

B+樹介紹

B+樹 是 B樹 的變體,常用於數據庫和操作系統的文件系統

  • MySQL數據庫的索引就是基於 B+樹 實現的

B+樹的特點:

  • 分爲內部節點非葉子)、葉子節點 2 種節點;
    內部節點只存儲 key,不存儲具體數據
    葉子節點存儲 key 和具體數據
  • 所有的葉子節點形成一條有序鏈表;
    在這裏插入圖片描述
  • m 階 B+樹 非根節點的元素數量 x:┌ m/2 ┐ ≤ x ≤ m

關於MySQL發音的官方說明
https://dev.mysql.com/doc/refman/8.0/en/what-is-mysql.html
The official way to pronounce “MySQL” is “My Ess Que Ell” (not “my sequel”),
but we do not mind if you pronounce it as “my sequel” or in some other localized way.

硬盤介紹

市面上常見的硬盤有:

  • 機械硬盤(Hard Disk Drive,HDD)
  • 固態硬盤(Solid State Drive,SSD)

在這裏插入圖片描述
後面的介紹針對機械硬盤

盤片(platter)、盤面(side)、讀寫磁頭(head)

硬盤一般由多個盤片組成,每個盤片包含2個盤面,每個盤面有1個對應的讀寫磁頭:盤面、磁頭由上到下從0開始編號;
在這裏插入圖片描述

磁道(track)、扇區(sector)

盤面中的一圈圈灰色圓環爲是一條條的磁道:磁道由外到內從0開始編號;

每條磁道上的一個弧段叫做一個扇區

  • 扇區是磁盤的最小讀寫單位
  • 一個扇區的大小通常是 512 字節(也有 4096 字節的)
    在這裏插入圖片描述

早期硬盤的扇區細節
每條磁道的扇區數相同

  • 所以外圈扇區的面積會比內圈扇區大

爲了更好的讀取數據,它們會存放相同的字節數

  • 所以外圈扇區的記錄密度要比內圈小,會浪費大量的存儲空間

硬盤的存儲容量 = 磁頭數 * 盤面磁道數 * 磁道扇區數 * 扇區字節數

柱面(cylinder)

相同編號的磁道形成一個圓柱,稱爲柱面

  • 磁盤的柱面數與一個盤面的磁道數是相等的
    在這裏插入圖片描述

磁盤塊

磁盤塊,在Windows中叫做 簇(cluster),在Linux中叫做 塊( block )

  • 相鄰的 2n 個扇區組合在一起,形成一個磁盤塊
  • 操作系統對磁盤進行管理時,以磁盤塊作爲最小讀寫單位

注意

  • 磁盤塊是操作系統中的一個虛擬概念
  • 扇區是磁盤上真實存在的物理區域

操作系統讀取硬盤數據的過程

  1. 操作系統將 LBA 傳送給磁盤驅動器並啓動讀取命令;
    LBA(Logical Block Address,邏輯塊地址
    比如類似設備號4、磁頭號4、磁道號8、扇區號16、扇區計數8這樣的信息。
  2. 磁盤驅動器根據 LBA 將磁頭移動到正確的磁道,盤片開始旋轉,將目標扇區旋轉到磁頭下;
  3. 磁盤控制器將扇區數據等信息傳送到一個處於磁盤界面的緩衝區;
  4. 磁盤驅動器向操作系統發出“數據就緒”信號;
  5. 操作系統從磁盤界面的緩衝區讀取數據;
    既可以按照一個字節一個字節的方式讀取,
    也可以啓動 DMA(Direct Memory Access,直接內存訪問)命令讀取。

磁盤完成IO操作的時間

主要由尋道時間旋轉延遲時間數據傳輸時間 3 部分構成:

  • 尋道時間(seek):軟件
    將讀寫磁頭移動至正確的磁道上所需要的時間,這部分時間代價最高
  • 旋轉延遲時間(rotation):硬件
    盤片旋轉將目標扇區移動到讀寫磁頭下方所需要的時間,取決於磁盤轉速
  • 數據傳輸時間(transfer):硬件
    完成傳輸數據所需要的時間,取決於接口的數據傳輸率,通常遠小於前兩部分消耗時間

決定時間長短的大部分因素是和硬件相關的,但所需移動的磁道數是可以通過操作系統來進行控制

  • 減少所需移動的磁道數是減少整個硬盤讀寫時間的有效辦法
  • 合理安排磁頭的移動以減少尋道時間就是磁盤調度算法的目的所在

查看硬盤信息

Windows

  • 如果是查看D盤,管理員權限打開命令行工具,輸入fsutil fsinfo ntfsinfo d:
    在這裏插入圖片描述
  • 或者搜索框輸入:系統信息
    在這裏插入圖片描述
    在這裏插入圖片描述

MySQL的索引底層爲何使用B+樹?

爲了減小 IO操作 數量,一般把一個節點的大小設計成最小讀寫單位的大小

  • MySQL 的存儲引擎 InnoDB 的最小讀寫單位是 16K

對比B樹,B+樹的優勢是:

  • 每個節點存儲的 key 數量更多,樹的高度更低
  • 所有的具體數據都存在葉子節點上,所以每次查詢都要查到葉子節點,查詢速度比較穩定
  • 所有的葉子節點構成了一個有序鏈表,做區間查詢時更方便
    例如查詢某個範圍內的數據,找到頭結點後再通過鏈表往後找即可。

B樹 與 B*樹

B樹:
在這裏插入圖片描述

B*樹 是 B+樹 的變體:給內部節點增加了指向兄弟節點的指針;

  • m階 B*樹 非根節點的元素數量 x:┌ 2m/3 ┐ ≤ x ≤ m

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章