資料庫索引採用B樹和B 樹的原因

2021-09-13 04:05:30 字數 2192 閱讀 1460

我們以丟擲問題的形式開始講解:

(1)資料庫檔案儲存的方式

(2)從資料庫讀取資料的原理

(3)減少磁碟io操作的影響因素

(4)基於磁碟io預讀機制,索引可以快速查詢資料

(a)什麼是索引

(b)為什麼要使用索引

(5)資料庫中使用什麼資料結構作為索引

(a)鍊錶

(b)陣列

(c)平衡二叉樹

(d)b樹和b+樹

(6)採用平衡二叉樹和b樹,資料查詢的對比

前面幾篇關於資料庫底層磁碟檔案讀取,資料庫索引實現細節進行了深入的研究,但是沒有串聯起來的講解為什麼資料庫索引會採用b樹和b+樹而不是其他的資料結構,例如平衡二叉樹、鍊錶等,因此,本文打算從資料庫檔案儲存以及讀取說起,講解資料庫索引的由來。

資料庫檔案儲存都是以磁碟檔案儲存在系統中的,這也是資料庫能持久化儲存資料的原因。

從資料庫讀取資料,先暫且不考慮從快取中讀取資料的情況,那就是從磁碟檔案中讀取資料的,我們知道從磁碟檔案中讀取資料是比較耗時的,資料庫的select操作的時間,取決於執行磁碟io的次數,因此儘量減少磁碟io就可以顯著的提公升資料的查詢速度

有哪些因素可以減少磁碟io呢,這首先得將了解一下磁碟io與預讀。   

磁碟io與預讀    

磁碟讀取依靠的是機械運動,分為尋道時間、旋轉延遲、傳輸時間三個部分,這三個部分耗時相加就是一次磁碟io的時間,大概9ms左右。這個成本是訪問記憶體的十萬倍左右;正是由於磁碟io是非常昂貴的操作,所以計算機作業系統對此做了優化:預讀;每一次io時,不僅僅把當前磁碟位址的資料載入到記憶體,同時也把相鄰資料也載入到記憶體緩衝區中。因為區域性預讀原理說明:當訪問乙個位址資料的時候,與其相鄰的資料很快也會被訪問到。每次磁碟io讀取的資料我們稱之為一頁(page)。一頁的大小與作業系統有關,一般為4k或者8k。這也就意味著讀取一頁內資料的時候,實際上發生了一次磁碟io。

正因為有了磁碟io預讀機制,所以才有了減少磁碟io的可能,因為一次磁碟io操作,可以查詢到物理儲存中相鄰的一大片資料。

以索引為b+樹為例:

磁碟io次數和索引資料結構查詢的次數以及磁碟io與預讀都有關係,具體關係:磁碟io次數 <= b+樹中從根節點一直到葉子節點整個過程中查詢的節點數。

一次磁碟io操作可以取出物理儲存中相鄰的一大片資料,如果查詢的索引資料(就是b+樹中從根節點一直到葉子節點整個過程中查詢的節點數)都集中在該區域,那麼只需要一次磁碟io,否則就需要多次磁碟io

到現在才開始講解索引了。正是基於磁碟io預讀機制的前提,資料庫可以採用索引機制快速查詢出資料。

索引是幫助資料高效查詢資料的一種資料結構,它包含乙個表中某些列的值以及記錄對應的位址,並且把這些值儲存在乙個資料結構中。常用的索引有b樹和b+樹

舉個例子來說,假設我們有乙個資料庫student,這個表分別有三個字段:name,age,class。假設表中有2000條記錄。

1、假如沒有使用索引,當我們查詢名為「xiaxia」的學生的時候,即呼叫:

select name,age,class from student where name = "xiaxia";

此時資料庫不得不在student表中對這2000條記錄一條一條的進行判斷name欄位是否為「xiaxia」。這也就是所謂的全表掃瞄。

2、而當我們在student表上的name欄位上建立索引時,當我們查詢名為「xiaxia」的學生時:

會通過索引查詢去查詢名為「xiaxia」的學生,因為該索引已經按照字母順序排列,因此要查詢名為「xiaxia」的記錄時會快很多,因為名字首字母為「x」的雇員都是排列在一起的。通過該索引,能獲取到表中對應的記錄。

鍊錶的查詢速度是o(n),每次查詢都得從煉表頭開始查詢,例如上面查詢「xiaxia」,如果xiaxia在1000的位置,那麼需要遍歷1000次才能查詢到。

有人可能會說,查詢速度肯定是資料最快呀,畢竟o(1),的確單純就select的話,採用陣列的形式是最合適的,但是採用陣列會遇到如下幾個問題:1、採用陣列的話,其他操作如delete、update、insert就不合適了;2、另外乙個原因:索引是存在於磁碟中,當索引非常大的時候,達到幾個g的時候,無法一次載入到記憶體中。

二叉查詢樹查詢的時間複雜度是o(logn),查詢速度最快和比較次數最少,既然效能已經如此優秀,但為什麼實現索引是使用b-tree而不是二叉查詢樹,關鍵因素是磁碟io的次數。

資料庫索引採用的資料結構

這裡直接引用感謝博主

感謝)更詳細資料庫索引:

資料庫採用B 樹而不是B 樹 b樹的原因

總結 1.不包含data 每頁的包含的內容會比較多,出度比較高.深度低,有效保證效能 2.葉子節點包含所有內容,便於全域性遍歷.原因 相對於b樹,1 b 樹空間利用率更高,可減少i o次數,一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查...

深入理解資料庫索引採用B樹和B 樹的原因

資料庫檔案儲存都是以磁碟檔案儲存在系統中的,這也是資料庫能持久化儲存資料的原因。從資料庫讀取資料,先暫且不考慮從快取中讀取資料的情況,那就是從磁碟檔案中讀取資料的,我們知道從磁碟檔案中讀取資料是比較耗時的,資料庫的select操作的時間,取決於執行磁碟io的次數,因此儘量減少磁碟io就可以顯著的提公...

資料庫索引(B樹,B 樹,雜湊)

一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一索引 不允許其中任何兩行具有相同值的索引 使用主鍵和候選鍵建立的索引就...