為什麼MySQL使用B 樹?

2021-10-18 12:57:05 字數 2111 閱讀 1879

首先需要理解磁碟io的原理

硬碟中一般會有多個碟片組成,每個碟片包含兩個面,每個盤面都對應地有乙個讀/寫磁頭。

將磁軌劃分為若干個弧段,每個磁軌上乙個弧段被稱之為乙個扇區(圖踐綠色部分),扇區是磁碟的最小組成單元。

硬碟通常由重疊的一組碟片構成,每個盤面都被劃分為數目相等的磁軌,並從外緣的「0」開始編號,具有相同編號的磁軌形成乙個圓柱,稱之為磁碟的柱面。

block:塊是虛擬出來的,是作業系統中最小的邏輯儲存單位。作業系統與磁碟打交道的最小單位是磁碟塊。由於扇區的數量比較小,數目眾多在定址時比較困難,所以作業系統就將相鄰的扇區組合在一起,形成乙個塊,再對塊進行整體的操作。

page:作業系統經常與記憶體和硬碟這兩種儲存裝置進行通訊,類似於「塊」的概念,都需要一種虛擬的基本單位。所以,與記憶體操作,是虛擬乙個頁的概念來作為最小單位,一般一頁為4kb(8個扇區,每個扇區125b,8*125b=4kb)。

旋轉延遲:碟片旋轉,將扇區旋轉到磁頭下。

軟體應著重考慮減少尋道時間和延遲時間,其中可以通過盡量將相關資訊放在同一盤塊,同一磁軌中,或者至少放在同一柱面或相鄰柱面上,以求在讀/寫資訊時儘量減少磁頭來回移動的次數,避免過多的尋道時間。

區域性性原理:指cpu訪問儲存器時,無論是訪問指令還是訪問資料,所訪問的儲存單元都趨於聚集在乙個較小的連續區域中。

三種不同型別的區域性性:

時間區域性性(temporal locality):如果乙個資訊項正在被訪問,那麼在近期它很可能還會被再次訪問。程式迴圈、堆疊等是產生時間區域性性的原因。

順序區域性性(order locality):在典型程式中,除轉移類指令外,大部分指令是順序進行的。順序執行和非順序執行的比例大致是5:1。此外,對大型陣列訪問也是順序的。指令的順序執行、陣列的連續存放等是產生順序區域性性的原因。

為了儘量減少i/o操作,計算機系統一般採取預讀的方式,預讀的長度一般為頁(page)的整倍數。主存和磁碟以頁為單位交換資料。當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。

由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率。

一般查詢樹

資料在儲存中的基本單位為頁,這也是進行資料讀取時候基本單位,一次讀取就是一次io操作

左邊的block在物理上不一定就是相連的,無法發揮區域性性原理,這樣每次都需要重新尋道,花費時間,隨著資料越多,樹的高度越高,每次查詢的磁碟io次數多。

b樹

b樹的每個節點中包含的資料多了,每個節點可以有多個子樹,每個節點可以包含多個資料,通過橫向擴充套件資料,減少整棵樹的高度。 在資料庫的應用中,資料庫充分利用磁碟讀取原理,將每個節點設為一頁(4kb)大小,這樣一次io就可以讀取到多個資料,而且在每次進行插入既新建節點時,直接申請乙個頁的空間,同時計算機分配按頁對齊的,再加上區域性性原理,可以大大提高效率。

b+樹

b+主要是通過將資料全部遷移到葉子節點上,葉子節點只儲存資料,非葉子節點只儲存指標,這樣每個節點就有更多儲存空間,從而儲存更多的資料。

一般在資料庫系統(mysql)或檔案系統中使用的b+tree結構都在經典b+tree的基礎上進行了優化,增加了順序訪問指標(雙向指標),這樣在範圍查詢只需要按照指標遍歷即可,提高效率。

MySQL索引原理分析(為什麼使用B 樹)

1 雜湊表有什麼特點?假如有這麼一張表 表名 sanguo 現在對name欄位建立雜湊索引 注意字段值所對應的陣列下標是雜湊演算法隨機算出來的,所以可能出現雜湊衝突。那麼對於這樣乙個索引結構,現在來執行下面的sql語句 select from sanguo where name 周瑜 可以直接對 周...

mysql b 1 mysql為什麼使用B 樹

mysql為什麼使用b 樹?1 如何從磁碟中獲取資料?io 要獲取磁碟上資料,必須先通過磁碟移動臂移動到資料所在的柱面,然後找到指定盤面,接著旋轉盤面找到資料所在的磁軌,最後對資料進行讀寫。磁碟io代價主要花費在查詢所需的柱面上,樹的深度過大會造成磁碟io頻繁讀寫。2 b 樹優點 b樹結構圖 b 樹...

MySQL 為什麼使用B 樹做索引結構

官方 索引是幫助mysql高效獲取資料的排好序的資料結構 mysql底層索引用的並不是完全的b樹,而是在b樹上做了一些改進得到的變種,也就是b 樹。非葉子節點不儲存data,只儲存索引 冗餘 可以放置更多的索引 葉子節點包含所有索引字段 葉子節點用雙向指標連線,提高區間訪問的效能 橫向可以儲存更多的...