在記錄排好序時,可以在記錄上建立稠密索引
鍵的順序與檔案中的排序順序一致,圖1為稠密索引的舉例:
圖1 稠密索引
當索引檔案中指向記錄本身的指標長度遠小於記錄本身長度,以至於可以存入到記憶體時,優勢就會非常明顯:每次查詢只需要使用一次i/o操作
使用稠密索引時,無需將索引放入記憶體即可知道檔案是否存在。可以進行範圍查詢
只為檔案的每個儲存塊設乙個鍵-指針對,節省了更多的儲存空間,但查詢給定值的記錄需要更多時間
稀疏索引的舉例如圖2所示:
圖2 稀疏索引
當索引可能佔了多個儲存塊時,可以在索引上再進行索引(二級索引層)。二級索引明顯比一級索引要少時,可以儲存在記憶體中。如果二級索引仍然太大,還可以繼續建立**、四級索引層,直至能夠存入記憶體
二級稀疏索引的舉例如圖3所示:
圖3 二級稀疏索引
圖4 輔助索引
使用乙個稱作「桶」的間接層,可以避免索引的鍵值重複,如圖5所示,索引的每個值,指向其在桶中第一次出現的位置:
圖5 使用「桶」
使用輔助索引,可以在檢索時,檢索盡可能少的資料塊
圖6 倒排索引
之所以叫做倒排,是因為:原本是檢索文件**現哪些詞,現在變為檢索詞出現在哪些文件中
相比於一級/兩級索引,商用系統更多使用的是b-樹及其變體b+樹結構
b-樹將儲存塊組織為樹的結構。此處的b-樹與資料結構中的b-樹相似,使用乙個引數n來決定所有儲存塊的布局(在這裡n為每個結點儲存的查詢鍵值的上限),例如,圖7是一棵n=3的b-樹:
圖7 n=3的b-樹
在資料庫的b-樹索引中,主要是要盡量將n取得足夠大
b-/b+樹的一系列指標,可以對應之前提到的任何一種索引:
b-樹:稠密索引
b+樹:稀疏索引
查詢的過程與資料結構中所提及的是一致的,即從根結點出發,根據與結點中的各數值大小作比較,然後根據比較結果選擇要進入到的子結點,直至到相應的葉結點進行最後的搜尋
而範圍查詢則是在到達葉結點之後,在要查詢的範圍內,從左到右挨個搜尋,直到正在搜尋的這個葉結點存在大於b的鍵為止
而插入和刪除,則需要根據b-樹的定義,來考慮結點的合併與**
通常情況下,資料庫的乙個索引只需要3層的b-樹結構就足以表示全部資訊。在引數n(b-樹每個結點的鍵的上限)非常大的情況下,根結點幾乎不會有任何改動,這時可以將根結點塊永久地緩衝在主存中,以減少磁碟i/o次數,使其比3次還少
包含大量記錄的雜湊表需要存放在輔助儲存器上,這樣的雜湊表桶陣列由儲存塊組成(而不是指向煉表頭的指標)。
雜湊表的結構如圖8所示:
圖8 雜湊表
在雜湊表的插入過程中,如果某個桶被裝滿,則新增溢位塊到該桶的鏈上:
同樣地,如果要進行刪除,在刪除後那個桶不再溢位,則可以將溢位塊刪去,並將裡面的元素移回前面的桶中
當絕大多數的桶都只由單個塊組成時,一般的查詢只需要一次磁碟i/o,但隨著檔案增長,溢位塊逐漸增多時,則讀長鍊錶需要更多次的磁碟i/o
可擴充套件雜湊表是一種動態雜湊方法,它用乙個指向塊的指標陣列來表示桶,而不再是用資料塊本身組成的陣列來表示
可擴充套件雜湊表的結構如圖9所示:
圖9 可擴充套件雜湊表
在圖9中,可以注意到資料塊的右上角方塊**現了1,表明存入的資料的前i位是用於確認是否能夠獲取存放到這個塊中的資格的。例如,i=1時,桶中對應數字1的指標所指向的那個塊,就是由第一位來進行判斷的:首位為1的資料可以有資格放入這個塊中
在插入到的塊中的空間已滿時,需要對那個塊進行**。**為兩個塊後,用於判斷是否有資格進入到此塊中的i位增加為i+1位,這樣就可以保證資料被順利地分到這兩個塊中
例如,在圖9的基礎上,插入乙個資料1010。這是1開頭的,故應該放入第二個資料塊中,但注意到第二個資料塊已經滿了,因此需要對其進行**。首先,讓資料塊的右上角變為2,以表示用前兩位來進行存放資格確認,隨後將10開頭的1001、正在插入的1010放入原有的塊中,而11開頭的1100則放入新增的塊中。同時,i=1也應改為i=2,桶的數量也變為4個,分別表示00、01、10、11:
可擴充套件列表對空間的占用可能會非常地大,而使用線性雜湊的策略可以使桶的增長較為緩慢
從一維索引的雜湊表,推廣到多維,有兩種資料結構,分別為網格檔案和分段雜湊函式:
網格檔案是將點空間劃分為許多網格,隨後分別將落入各區域的點存入相應的桶中:
樹的每一層的結點,都是乙個屬性的索引:
所有維的屬性在層間交替出現:
在四叉樹中,每個內部結點對應於k維空間中的k維立方體:
r-樹表示由二維或更高維區域組成的資料,稱之為資料區
位圖索引使用位向量表示資料出現的位置
位圖索引允許我們在許多情形下高效地回答部分匹配查詢
例如,有如下12條記錄:
對於第乙個分量,共有7種值,據此寫出相應的7個向量(某個值相應的向量的第i位為1,表示在第i條記錄中的該分量取這個值):
而對於第二個分量,則有10種值,據此寫出相應的10個向量:
現在要查詢分量1位於45~55之間、分量2位於100~200之間的記錄。首先對第一組向量中,45和50所對應的向量進行按位或運算,隨後再對第二組向量中,100、110、120和140所對應的向量進行按位或運算,最後再對這兩個結果進行按位與運算,所得向量中值為1的位,即為查詢目標所在的位
向量過長,而1非常少時,可以考慮進行編碼,以壓縮位圖
其中一種可行的方法:首先需要確定i的二進位制表示是多少位,然後設定乙個由(位數-1)個1和1個0所組成的二進位制序列,再在它後面加上i的二進位制表示
例如:i=13,則需要用4位二進位制來表示i,因此先設定乙個二進位制序列1110(4-1=3個1),再在後面跟上13的二進位制序列1101,即最後得到13的編碼:11101101
反過來進行解碼也是可行的:例如對於11101101001011,首先識別出1110,可以確定此數的二進位制共有4位,因此再看隨後4位,為1101,即第乙個整數為13。再往後看,為0,即下乙個數只有1位,而下一位還是0,因此第二個整數為0。繼續往後看,為10,因此下乙個數共有兩位,為11,即第三個整數是3。綜上所述,三個整數分別為13,0和3,這樣也即完成了解碼
資料庫系統 學習記錄4
判斷關係所屬正規化時,需要先找到候選關鍵字 沒有在fd右邊出現的屬性必定是候選關鍵字的一部分,如果找不到,則進行列舉,尋找閉包 沒有非主屬性,一定是第三正規化 用於表達資料庫的設計的方式包括 e r圖 uml odl 相似抽象物件的集合為實體集 實體集與屬性相關聯,屬於實體的特性 兩個或多個實體集之...
資料庫系統 學習資料 更新
首先要提一點,平時我們總愛把資料庫管理系統 dbms 簡稱為資料庫系統,注意兩者是不同的。mysql sql server oracle等這些全是資料庫管理系統,是乙個軟體而已。學習乙個新東西,最好最快的方式就是看到它,去操作它,有了乙個認識後,再進一步深入研究它,介於此,我推薦一下自己的學習方式。...
資料庫系統 學習記錄15 課程完結
事務t的時間戳 ts t 事務t將自己開始的訊息發給排程器的時刻 使用系統clock或維護乙個計數器,都可以對時間戳的生成進行實現 對於每乙個資料庫元素x,都有兩條相關的時間戳以及乙個額外的位 1 rt x 最近一次有事務對x進行讀取的時間戳 2 wt x 最近一次有事務對x進行寫入的時間戳 3 c...