要知道資料庫選擇b-tree結構作為索引的原因,需要先了解電腦科學中的區域性性原理和磁碟預讀。
電腦科學中著名的區域性性原理:當乙個資料被用到時,其附近的資料也通常會馬上被使用。程式執行期間所需要的資料通常比較集中。
由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率。由於儲存介質的特性,磁碟本身訪問就比主存慢很多,再加上機械運動耗費,磁碟的訪問速度往往是主存的幾百分分之一,因此為了提高效率,要儘量減少磁碟i/o。為了達到這個目的,磁碟往往不是嚴格按需讀取,而是每次都會預讀,即使只需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體。預讀的長度一般為頁(page)的整倍數。頁是計算機管理儲存器的邏輯塊,硬體及作業系統往往將主存和磁碟儲存區分割為連續的大小相等的塊,每個儲存塊稱為一頁(在許多作業系統中,頁得大小通常為4k),主存和磁碟以頁為單位交換資料。當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。
一般使用磁碟i/o次數評價索引結構的優劣。先從b-tree分析,根據b-tree的定義,可知檢索一次最多需要訪問h個節點。資料庫系統的設計者巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。為了達到這個目的,在實際實現b-tree還需要使用如下技巧:
每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個node只需一次i/o。
b-tree中一次檢索最多需要h-1次i/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logdn)。一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3)。
而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性,所以紅黑樹的i/o漸進複雜度也為o(h),效率明顯比b-tree差很多。
定義:示意圖
優缺點定義:
b+樹是b-樹的變體,也是一種多路搜尋樹:其定義基本與b-樹同,除了:
示意圖
優缺點
定義:是b+樹的變體,在b+樹的非根和非葉子結點再增加指向兄弟的指標;
示意圖
優缺點
MySQL 基礎篇 之索引
一 索引的引入 索引定義 索引是由資料庫表中一列或者多列組合而成,其作用是提高對錶中資料的查詢速度。類似於圖書的目錄,方便快速定位,尋找指定的內容,如一本1000頁的書,如果沒有目錄,你想要知道指定的內容,必須要1頁1頁翻過去,是不是很浪費時間?二 索引的優缺點 優點 提高查詢資料的速度。缺點 建立...
Mysql系列之索引篇
為了提高資料庫的查詢效率,然後我們會給一些字段增加索引,但是大家有沒有考慮過,索引是什麼?我們為什麼要用索引?增加了索引就一定快嗎?如何實現按照索引查詢呢?索引的資料結構有哪些呢?它分為哪幾類呢?大家別懵,下面就深入去探個究竟吧!索引是為了加快對錶中資料行的檢索而建立的一種分散儲存的資料結構 通俗來...
mysql 索引 二 MySQL學習之索引(二)
高效能的索引策略 isolating the column 孤立列就是說,這一列不能在表達示中或在乙個函式裡面,如 mysql select actor id from actor where actor id 1 5 錯誤 再如 mysql select where to days current...