《數據庫系統概念》13-索引

索引分爲順序索引(ordered indixes)和散列(hash indices)索引,前者基於值的順序;後者將值平均分佈到若干bucket中,值所屬的bucket由散列函數決定。
索引和散列的實現技術有多種,但沒有哪種是絕對最好的,每種方式有其最適合的場景,可經過這幾個方面來進行評估:訪問類型(能有效支持的訪問類型,如特定值查找、範圍查找)、訪問時間、插入時間、刪除時間、空間開銷(索引額外佔用的空間)。

1、順序索引
a)爲了快速隨機訪問記錄,可使用順序索引。用於在文件中查找記錄的屬性或屬性集稱爲搜索碼(search key),每一個索引結構與一個特定的搜索碼關聯,並按順序存儲搜索碼的值,將每一個搜索碼與對應的記錄關聯起來。
被索引的記錄自己也能夠按必定的順序存儲,若是記錄按照某個搜索碼指定的順序排序,則該搜索碼對應的索引稱爲彙集索引(clustering index)或主索引(primary index),彙集索引的搜索碼通常是主鍵,但不是必須這樣。搜索碼指定的順序與記錄的物理存儲順序不一樣的索引稱爲非彙集索引(noclustering index)或輔助索引(secondary index)。

b)稠密索引和稀疏索引
索引項由搜索碼和指向具備該搜索碼值的若干條記錄的指針構成,指針包含block的標識和標識磁盤塊內記錄的塊內偏移量。順序索引又分爲稠密索引(dense index)和稀疏索引(sparse index)。
稠密索引中,每一個搜索碼都有一個索引項。索引項包含搜索碼值以及指向具備該搜索碼值的第一條數據記錄的指針。若是是稠密彙集索引,具備相同搜索碼值的其他記錄能夠順序地存儲在第一條數據記錄以後;對於非彙集索引,則須要爲每條搜索碼值創建索引。
稀疏索引中,只爲搜索碼的某些值創建索引項。只有索引是彙集索引時纔可使用稀疏索引,這樣,即便索引中沒有要查找的搜索碼,也能夠根據索引肯定搜索碼的區間,進而找到要查找的記錄。

c)多級索引
若是記錄數不少,其索引也會變得很大。假定100條索引佔用一個4K的block,那麼100,000,000條記錄的索引的體積會高達4G。只有將所有索引都裝載到內存,才能最大化索引的速度,若是計算機內存小於4G,那麼索引就沒法徹底放入內存中,即便內存夠大,也還要供給其餘應用程序使用。
在數據量很大、索引文件較大時可使用多級索引,即在原先內層索引的基礎上再創建若干層外層索引,外層索引與內層索引之間的關係同前面索引與數據文件的關係同樣。多級索引與樹結構緊密相關,好比用於內存索引的二叉樹。

2、索引的更新
在插入、刪除數據的時候,對應的索引須要更新;而數據被修改時,其索引項不是直接修改,而是分爲「刪除就搜索碼值,插入新搜索碼值」這兩步執行的,因此索引的更新只涉及插入和刪除。
a)插入
稠密索引
若是插入數據的搜索碼值在索引中不存在,則直接插入索引。
若是插入的搜索碼值已經存在且指向多條數據,則在這條索引項下新增指向插入數據的指針。
若是插入的搜索碼值已經存在但只指向第一條包含該搜索碼值的記錄,則僅將插入數據放到具備相同搜索碼值的其餘記錄以後。
稀疏索引
假設稀疏索引爲每一個塊保存了一個索引項。若是插入數據時,系統須要新建立一個塊,則在索引中插入針對新塊中第一條記錄的搜索碼的索引項。若是新插入的數據刷新了塊中記錄的最小搜索碼值(按照搜索碼的順序存儲),這個指向這個塊的索引項須要被更新;其他狀況不須要更新索引。

b)刪除
稠密索引
若是待刪除的記錄的搜索碼值是惟一的,則刪除對應的索引。
若是待刪除記錄的搜索碼值不惟一,且索引項指向全部具備該搜索碼值的記錄,則只刪除索引項中指向待刪除記錄的指針。
若是待刪除記錄的搜索碼值不惟1、索引項僅指向第一條具備該搜索碼值的記錄,並且第一條記錄待刪除,在刪除這條記錄的同時,將索引項指向下一條具備該搜索碼值的記錄。
稀疏索引
若是不存在包含被刪除記錄的索引項,則不作任何操做。
若是被刪除的記錄是具備該搜索碼值的惟一記錄,則索引項A指向下一個包含該搜索碼值的記錄,但若是下一個包含該搜索碼值的記錄已經有索引項,則刪除索引項A。
若是被刪除的記錄並不是是具備該搜索碼值的惟一記錄,則索引項指向下一條具備相同搜索碼值的記錄。


學習資料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan函數

相關文章
相關標籤/搜索