資料庫檔案儲存都是以磁碟檔案儲存在系統中的,這也是資料庫能持久化儲存資料的原因。
從資料庫讀取資料,先暫且不考慮從快取中讀取資料的情況,那就是從磁碟檔案中讀取資料的,我們知道從磁碟檔案中讀取資料是比較耗時的,資料庫的select操作的時間,取決於執行磁碟io的次數,因此儘量減少磁碟io就可以顯著的提公升資料的查詢速度。
有哪些因素可以減少磁碟io呢,這首先得將了解一下磁碟io與預讀。
磁碟讀取依靠的是機械運動,分為尋道時間、旋轉延遲、傳輸時間三個部分,這三個部分耗時相加就是一次磁碟io的時間,大概9ms左右。這個成本是訪問記憶體的十萬倍左右;正是由於磁碟io是非常昂貴的操作,所以計算機作業系統對此做了優化:預讀;每一次io時,不僅僅把當前磁碟位址的資料載入到記憶體,同時也把相鄰資料也載入到記憶體緩衝區中。因為區域性預讀原理說明:當訪問乙個位址資料的時候,與其相鄰的資料很快也會被訪問到。每次磁碟io讀取的資料我們稱之為一頁(page)。一頁的大小與作業系統有關,一般為4k或者8k。這也就意味著讀取一頁內資料的時候,實際上發生了一次磁碟io。
正因為有了磁碟io預讀機制,所以才有了減少磁碟io的可能,因為一次磁碟io操作,可以查詢到物理儲存中相鄰的一大片資料。
綜述所述,為了減少效能消耗,資料庫索引採用的結構需要盡可能的減少磁碟io操作。首先我們來了解一下什麼是索引、索引有什麼作用。
索引是幫助資料高效查詢資料的一種資料結構,它包含乙個表中某些列的值以及記錄對應的位址,並且把這些值儲存在乙個資料結構中。常用的索引有b樹和b+樹。
打個比方,比如我們查詢select * from user where username=『xiaoming』;如果沒有索引的是不是需要全表掃瞄。然而,當我們新增索引之後,只需根據』xiaoming』這個關鍵字來找到對應的對映(也就是找到對應的位址)。
鍊錶的查詢速度是o(n),每次查詢都要從煉表頭開始查詢,如何索引值在最末尾,那全部都訪問了,是不是磁碟io次數為n,非常耗效能。
資料的查詢速度最快,但是採用陣列會遇到如下幾個問題:1、採用陣列的話,其他操作如delete、update、insert就不合適了;2、另外乙個原因:索引是存在於磁碟中,當索引非常大的時候,達到幾個g的時候,無法一次載入到記憶體中。
平衡二叉樹的時間複雜度為o(logn),查詢速度最快(資料除外,資料侷限性,不能做比較)且比較次數較少。然而,資料庫索引不用平衡二叉樹。就在於b樹結構,減少了磁碟io的預讀次數。
我看一一篇博文關於其內容的,講的非常好,值得推薦
資料庫索引採用B樹和B 樹的原因
我們以丟擲問題的形式開始講解 1 資料庫檔案儲存的方式 2 從資料庫讀取資料的原理 3 減少磁碟io操作的影響因素 4 基於磁碟io預讀機制,索引可以快速查詢資料 a 什麼是索引 b 為什麼要使用索引 5 資料庫中使用什麼資料結構作為索引 a 鍊錶 b 陣列 c 平衡二叉樹 d b樹和b 樹 6 採...
深入理解B 樹與B 樹
在看這篇文章之前,我們回顧一下前面的幾篇關於mysql的文章,應該對你讀下面的文章有所幫助。在介紹b 樹之前,先簡單的介紹一下b樹,這兩種資料結構既有相似之處,也有他們的區別,最後,我們也會對比一下這兩種資料結構的區別。1.1 b樹概念 b樹也稱b 樹,它是一顆多路平衡查詢樹。二叉樹我想大家都不陌生...
深入理解B樹和B 樹 二 B 樹的優點
有了b樹,為什麼還需要b 樹呢?那就要先說下b樹的缺點了,人類對於效能的追求是無止境的,b樹相比二叉樹雖好,但還是存在以下問題 1.每個節點中既要存索引資訊,又要存其對應的資料,如果資料很大,那麼當樹的體量很大時,每次讀到記憶體中的樹的資訊就會不太夠。2.b樹遍歷整個樹的過程和二叉樹本質上是一樣的,...