一、稠密索引
如果記錄是排好序的,我們就可以在記錄上建立稠密索引,它是這樣一系列存儲塊:塊中只存放記錄的鍵以及指向記錄本身的指針,指針就是一個指向記錄或存儲塊地址。稠密索引文件中的索引塊保持鍵的順序與文件中的排序順序一致。既然我們假定查找鍵和指針所占存儲空間遠小於記錄本身,我們就可以認為存儲索引文件比存儲數據文件所需存儲塊要少得多。當內存容納不下數據文件,但能容納下索引文件時,索引的優勢尤為明顯。這時,通過使用索引文件,我們每次查詢只用一次I/O操作就能找到給定鍵值的記錄。
www.2cto.com
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
www.2cto.com
在已有稀疏索引的情況下,要找出查找鍵值為K的記錄,我們得在索引中查找到鍵值小於或等於K的最大鍵值。由於索引文件已按鍵排序,我們可以使用二分查找法來定位這個索引項,然后根據它的指針找到相應的數據塊。現在我們必須搜索這個數據塊以找到鍵值為K的記錄。當然,數據塊中必須有足夠的格式化信息來標明其中的記錄及記錄內容,可以采用2.5節和2.7節中的任何技術。