一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟i/o操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。為什麼使用b-/+tree,還跟磁碟訪問原理有關。
區域性性原理與磁碟預讀
由於儲存介質的特性,磁碟本身訪問就比主存慢很多,再加上機械運動耗費,磁碟的訪問速度往往是主存的幾百分分之一,因此為了提高效率,要儘量減少磁碟i/o。為了達到這個目的,磁碟往往不是嚴格按需讀取,而是每次都會預讀,即使只需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體。這樣做的理論依據是電腦科學中著名的區域性性原理:
當乙個資料被用到時,其附近的資料也通常會馬上被使用。
程式執行期間所需要的資料通常比較集中。
由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率。
預讀的長度一般為頁(page)的整倍數。頁是計算機管理儲存器的邏輯塊,硬體及作業系統往往將主存和磁碟儲存區分割為連續的大小相等的塊,每個儲存塊稱為一頁(在許多作業系統中,頁得大小通常為4k),主存和磁碟以頁為單位交換資料。當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。
我們分析了b-/+tree檢索一次最多需要訪問節點:
h = log┌m/2┐((n+1)/2 )+1
資料庫系統巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。為了達到這個目的,在實際實現b- tree還需要使用如下技巧:
每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個node只需一次i/o。
b-tree中一次檢索最多需要h-1次i/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logmn)。一般實際應用中,m是非常大的數字,通常超過100,因此h非常小(通常不超過3)。
而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性,所以紅黑樹的i/o漸進複雜度也為o(h),效率明顯比b-tree差很多(以後要學習下紅黑樹)。
為什麼使用 DOCTYPE html
a doctype is a mostly useless,but required,header.html5 spec 現在的各種web開發工具都足夠強大,支援插入模板 因此你並不需要把這又長又臭的doctype乙個個字母的敲出來。doctype最大的作用是讓瀏覽器用來選擇渲染模式,或者說是用來觸...
為什麼使用指標
在實際程式設計中,既然使用變數就可以訪問資料,為什麼還用指標呢?使用指標來操縱自動變數的唯一原因是,為了說明指標的工作原理。指標真正的用途是被用於完成下列3種任務 管理自由儲存區中的資料 訪問類的成員資料和函式 按引用傳遞引數 在 函式的 工作原理 中,提到了5個記憶體區域 全域性命名空間 自由儲存...
為什麼使用Servlet amp JSP
web伺服器接收客戶請求,查詢資源,然後向客戶返回一些結果。web客戶允許使用者請求伺服器上的某個資源,並且向使用者顯示請求的結果。客戶和伺服器使用http協議進行通訊,伺服器使用http向客戶傳送html。tcp協議負責確保從乙個網路節點向另乙個網路節點傳送的檔案能作為乙個完整的檔案到達目的地,i...