2023年4月23日 wray zheng9
文章目錄
為什麼需要索引?
我們知道,磁碟的讀寫效率是比較低的,以傳統機械硬碟為例,讀寫時涉及到讀寫頭的尋道和定位,這部分時間開銷可能比實際讀寫資料時所花的時間還要長。即使是固態硬碟,由於資料的儲存可能是散落在各個磁碟塊中,通過指標連線起來,因此訪問資料時需要對磁碟進行多次讀寫,同樣會帶來效率上的問題。
再來看資料庫的儲存,資料庫中的乙個表可能儲存在多個檔案中,而每個檔案包含了多個磁碟塊(扇區),我們討論最好的情況,也就是所有記錄都是按查詢的字段進行排序,那麼此時可以利用二分法等高效的演算法進行搜尋。如果是在記憶體中進行這種搜尋,log(n) 的時間確實非常高效,但放在磁碟中就未必了,為什麼這麼說?
因為這些高效演算法通常都是在記憶體中操作的,也就是說資料都已經被載入到記憶體中。而乙個表中包含的資料量可能很大,沒辦法將這些資料一次性裝載到記憶體中,因此我們需要通過多次讀寫磁碟來完成這些操作。這樣一來,磁碟本身的檔案組織方式就會對演算法的效率造成影響。
比如我們用二分法來查詢資料,二分法是建立在資料能夠被隨機訪問的基礎上的,這樣可以計算出中間位置,並直接訪問該位置。如果磁碟塊是連續的還好,假設每條記錄定長,那麼我們可以得到中間位置的扇區號,直接訪問該扇區,從而得到目標記錄;但如果磁碟塊不連續,那麼只能通過指標進行連線,這樣我們就沒辦法直接得出中間位置的扇區號,只能從第乙個磁碟塊開始,依次訪問它的下乙個磁碟塊,也就是順序訪問,即使記錄是有序的,二分法也沒有用武之地,只能從頭遍歷記錄進行查詢。
總結上述提到的問題,就是當資料量大的時候,資料無法被一次性載入到記憶體中,因此對資料的查詢操作受限於檔案在磁碟中的儲存方式,特別是利用指標來連線不連續磁碟塊的情況,極大影響查詢效率。
因此,我們想到了用索引來定位記錄,提高查詢的效率。
索引中的一些概念
以字典為例,每個字及其解釋都可以看作一條記錄,這條記錄大致可分為幾個字段:字、讀音、解釋。
我們是如何查詢乙個字對應的記錄呢?通過目錄。
因此目錄就相當於 索引,目錄中記錄了每個字及其對應的頁碼,相當於乙個個 索引項。
我們是根據什麼來找到索引項的?對了,是字。因此字就是用於索引的字段,叫做 索引字段,頁碼相當於一條記錄的實際儲存位址,等價於指向記錄所在磁碟位置的指標。
儲存索引項的檔案稱為 索引檔案,而儲存實際資料(表)的檔案稱為 主檔案。
索引如何提高查詢效率?
索引的意義,就在於它只抽取了原記錄中的一部分關鍵的資訊,並與記錄的位置建立關聯,以此定位記錄在磁碟上的真正位置。
索引儲存的資料較少,更容易被載入到記憶體中,也就意味著我們可以通過高效的演算法在索引上查詢目標記錄的索引項,得到目標記錄在磁碟上的位置,然後直接讀取該記錄。
例如以欄位 a 作為索引,那麼每個索引項只存 a 的值,以及 a 對應記錄所在磁碟的位置。這樣一來,我們通常可以將索引檔案載入到記憶體中,然後根據待查詢記錄字段 a 的值,找到索引項,得到該記錄在磁碟中的位置,就能直接到特定磁碟塊將目標記錄讀取出來。
索引的分類
稀疏索引與稠密索引
首先說說稀疏索引。
稀疏索引只包含了索引欄位中一部分的值,通過這些值可以確定目標記錄的範圍,然後再到這個範圍中順序查詢。因此,稀疏索引要求主檔案必須按照索引字段進行排序,通常索引檔案本身也有相同的排序關係。
下面會講到主索引,它是一種特殊的稀疏索引,它的索引項並不是指向記錄,而是指向記錄所在的儲存塊。也就是說,乙個儲存塊對應乙個索引項。
再來說說稠密索引。
稠密索引,顧名思義,就是索引項非常稠密,到什麼程度呢?每個索引欄位的值都對應乙個索引項。
如果索引字段沒有重複值,那麼索引和記錄就是一一對應的關係:
如果索引字段包含重複的值,有三種索引策略。
一是索引中包含重複值:
此時索引項和記錄也是一一對應的關係。
二是索引中不包含重複值,主檔案按索引字段排序:
因為索引字段值相同的記錄是連續放在一起的,因此索引項只需指向索引字段值相同記錄中的第一條記錄。
三是索引中不包含重複值,主檔案不按索引字段排序:
這裡引入了乙個中間層。因為主檔案中索引字段值存在重複,並且沒有按照索引字段排序,因此必須對每條記錄建立乙個索引,才能由索引檔案找到主檔案中的記錄。但是由於索引中不包含重複值,因此我們可以引入乙個中間層,讓索引項不直接指向記錄,而是指向中間層。中間層的指標桶與記錄一一對應,並且索引字段值相同的記錄對應的指標桶是連續存放的,這樣就等價於中間層是按索引字段進行排序。
我們來總結一下稠密索引:
主索引與輔助索引
主索引通常是針對每個儲存塊建立乙個索引項,索引項的個數與儲存表所佔的磁碟塊數相同。
儲存表中位於每一儲存塊的第一條記錄稱為錨記錄,或稱為塊錨。
主索引和主檔案通常都是按照索引字段進行排序,如前面所說,主索引是稀疏索引。
輔助索引是稠密索引,它是建立在乙個或多個非排序欄位上的輔助儲存結構,通常不同的索引字段值對應乙個索引,如果有重複的索引字段值,則用類似鍊錶的結構來儲存具有相同索引字段值記錄的位置,也就是前面提到的引入中間層的策略。
總結和對比主索引與輔助索引:
聚簇索引和非聚簇索引
聚簇索引 —— 索引中鄰近的記錄在主檔案中也是鄰近儲存的;
非聚簇索引 —— 索引中鄰近的記錄在主檔案中不一定是臨近儲存的。
總結這篇文章對索引進行了概括性的介紹,說明了索引在資料庫查詢中的意義,並介紹了索引的幾種分類方式。
有關索引的具體實現,包括 b+ 樹索引以及雜湊索引,後續將會單獨進行介紹。
關於系統架構師
歷次面試的時候,面試官總會問乙個問題 請說一下你的職業規劃 我總是說 我想走一條偏重技術的道路,我的職業規劃大體可以分幾個階段 程式設計師 高階程式設計師 架構師 資深技術專家.說是這樣說,其實自己心裡對架構師所要負責的工作還是比較模糊的。為什麼要成為架構師呢?第 一 符合自己偏重技術的道路,給自己...
架構師之路 快取與資料庫
一 更新快取vs淘汰快取 1 更新快取 資料不但寫入資料庫,還會寫入快取。優點 快取不會增加一次miss,命中率高。2 淘汰快取 資料只會寫入資料庫,不會寫入快取,只會把資料淘汰掉。優點 簡單。3 如何選擇呢 更新的代價不是太大則更新快取,否則淘汰快取。二 先運算元據庫vs先操作快取 1 如何選擇 ...
系統架構師 作業系統 檔案管理
作業系統對計算機的管理包括兩個方面 硬體資源和軟體資源。硬體資源的管理包括cpu管理 儲存器管理 裝置管理等,主要解決硬體資源的有效和合理利用問題。軟體資源包括各種系統程式 各種應用程式 各種使用者程式,也包括大量的文件材料 庫函式等。每一種軟體資源本身都是具有一定邏輯意義的相關資訊的集合,在作業系...