我們以丟擲問題的形式開始講解:
(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 樹,雜湊)
一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一索引 不允許其中任何兩行具有相同值的索引 使用主鍵和候選鍵建立的索引就...