資料庫稠密索引與稀疏索引

2021-06-22 07:22:26 字數 1319 閱讀 7948

一、稠密索引

如果記錄是排好序的,我們就可以在記錄上建立稠密索引,它是這樣一系列儲存塊:塊中只存放記錄的鍵以及指向記錄本身的指標,指標就是乙個指向記錄或儲存塊位址。稠密索引檔案中的索引塊保持鍵的順序與檔案中的排序順序一致。既然我們假定查詢鍵和指標所佔儲存空間遠小於記錄本身,我們就可以認為儲存索引檔案比儲存資料檔案所需儲存塊要少得多。當記憶體容納不下資料檔案,但能容納下索引檔案時,索引的優勢尤為明顯。這時,通過使用索引檔案,我們每次查詢只用一次i/o操作就能找到給定鍵值的記錄。

www.2cto.com  

下圖所示為乙個建立在順序檔案上的稠密索引。

圖1 順序檔案(右)上的稠密索引(左)

第乙個索引塊存放指向前四個記錄的指標,第二個索引塊存放指向接下來的四個記錄的指標,依此類推。

稠密索引支援按給定鍵值查詢相應記錄的查詢。給定乙個鍵值k,我們先在索引塊中查詢k。當找到k後,我們按照k所對應的指標到資料檔案中找到相應的記錄。似乎在找到k之前我們需要檢索索引檔案的每個儲存塊,或平均一半的儲存塊。然而,由於有下面幾個因素,基於索引的查詢比它看起來更為有效:

1.索引塊數量通常比資料塊數量少。

2.由於鍵被排序,我們可以使用二分查詢法來查詢k。若有n個索引塊,我們只需查詢log2n個塊。

3.索引檔案可能足夠小,以至可以永久地存放在主存緩衝區中。要是這樣的話,查詢鍵k時就只涉及主存訪問而不需執行i/o操作。

二、稀疏索引

稀疏索引只為資料檔案的每個儲存塊設乙個鍵-指針對,它比稠密索引節省了更多的儲存空間,但查詢給定值的記錄需更多的時間。只有當資料檔案是按照某個查詢鍵排序時,在該查詢鍵上建立的稀疏索引才能被使用,而稠密索引則可以應用在任何的查詢鍵。如圖2所示,稀疏索引只為每個儲存塊設乙個鍵-指針對。鍵值是每個資料塊中第乙個記錄的對應值。

圖2 順序檔案上的稀疏索引

同圖1例項一樣,我們假定資料檔案已排序,且其鍵值為連續的10的倍數,直至某個較大的數。我們還繼續假定每個儲存塊可存放四個鍵-指針對。這樣,第乙個索引儲存塊中為前四個資料儲存塊的第乙個鍵值的索引項,它們分別是10、30、50和70。按照前面假定的鍵值模式,第二個索引儲存塊中為第五至第八個資料儲存塊的第乙個鍵值的索引項,它們分別是90、110、130和150。圖中我們還列出第三個索引儲存塊存放的鍵值,它們分別是假設的第九至第十二個資料儲存塊的第乙個鍵值。

www.2cto.com  

在已有稀疏索引的情況下,要找出查詢鍵值為k的記錄,我們得在索引中查詢到鍵值小於或等於k的最大鍵值。由於索引檔案已按鍵排序,我們可以使用二分查詢法來定位這個索引項,然後根據它的指標找到相應的資料塊。現在我們必須搜尋這個資料塊以找到鍵值為k的記錄。當然,資料塊中必須有足夠的格式化資訊來標明其中的記錄及記錄內容,可以採用2.5節和2.7節中的任何技術。

資料庫索引之稠密索引和稀疏索引

在了解稠密索引和稀疏索引之前,我們先了解下什麼是聚集索引。所謂聚集索引指的是 在乙個檔案中可以有多個索引,分別基於不同的搜尋碼。搜尋碼 用於在檔案中查詢記錄的屬性或屬性集 如果包含記錄的檔案按照某個指定的順序排序,那麼該搜素碼對應的索引就是聚集索引。稠密索引 上圖所示 在稠密索引中檔案中的每個搜尋碼...

mysql 稀疏 稀疏索引和稠密索引你了解嗎?

背景 最近參加了乙個面試,面試官先問了mysql的資料庫的索引的底層資料介面,我回答了 平時都用的是innodb引擎,所以其底層的索引資料型別是b 樹。面試官問我用沒用過稀疏索引。當時就懵了,聚集索引,非聚集索引,主鍵索引,覆蓋索引等等,我也沒聽過什麼是稀疏索引。我反問了一下 面試官這個索引型別是m...

索引4 密集索引與稀疏索引

u密集索引與稀疏索引區別 秘籍索引檔案中的每個搜尋碼值都對應乙個索引值 稀疏索引檔案只為索引碼的某些值建立索引項 密集索引的定義 葉子節點儲存的不只是鍵值,還儲存了位於同一行記錄裡的其他列的資訊,由於密集索引決定了表的物理排列順序,乙個表只有乙個物理排列順序,所以乙個表只能建立乙個密集索引 稀疏索引...