資料庫系統 - 面向應用的方法

weixin_34279184發表於2010-09-15
資料庫系統-面向應用的方法

一些概念
關係、元組、屬性
在關聯式資料庫理論中,關係 (relation)對應於資料庫技術的表 (table),元組 (tuple)對應於行 (row),屬性 (attribute)對應於列 (column)
元組的元 (arity)為屬性數量,即列的數量,一元unitary,二元binary,三元ternary等
關係的勢 (cardinality)為關係中的元組數量,即行數

Projection operator 投影運算
即選取僅選取部分列的查詢

Materialized view 物化檢視
即被快取記憶體的檢視

RAID
Redundant Array of Independent Disks,廉價磁碟冗餘陣列。利用拆分(striping)提高效能,使用冗餘提高可靠性。參考RAID on wikipedia
RAID0

RAID0塊級拆分,沒有冗餘。拆分的檔案支援併發存取,但任何一塊磁碟損壞將導致所有檔案損壞

RAID1

RAID1僅做冗餘,沒有拆分。支援併發讀取,提高了讀取效能,寫入時需要同時寫入多塊磁碟

RAID2

RAID2位元組級拆分(檔案相鄰的位元組均被拆分儲存到不同磁碟中),有一塊或多塊奇偶校驗盤(圖中的Disk 4, 5, 6)用於容錯

RAID3

RAID3位元組級拆分,有一塊獨立的奇偶校驗盤(圖中的Disk 3)

RAID4


RAID4塊級拆分,有一塊獨立的奇偶校驗盤。任何一塊磁碟損壞不會造成資料丟失,2塊盤損壞時將丟失資料

RAID5

RAID5塊級拆分,具備奇偶校驗,但沒有獨立的奇偶盤,奇偶校驗與檔案資料一起被拆分在多個盤中。任何一塊磁碟損壞不會造成資料丟失,2塊盤損壞時將丟失資料

RAID6

RAID6塊級拆分,有2塊奇偶盤,最多在2塊磁碟損壞時不會造成資料丟失

儲存
堆檔案 heap file:記錄無序,僅在末尾新增,刪除記錄時不釋放空間,不適合查詢
順序檔案 sorted file:按某些列的順序存放,可運用二分查詢等優化演算法
填充因子 fill factor:每頁預留空間供插入操作,預留空間滿了以後使用溢位鏈overflow chain支援插入操作

索引
整合索引 integrated index:索引條目跟資料記錄整合在一起
聚集索引 clustered index:對於有序索引(B+ tree等),如果索引條目與資料記錄都是按照相同的search key排序的,則為聚集索引,整合索引是一種聚集索引;對於雜湊(hash)索引,如果雜湊索引條目就是資料記錄則為聚集的,此時hash bucket本身就是資料檔案的儲存結構,資料檔案就是hash bucket的序列
聚集索引通常又稱為main index,非聚集索引又稱為secondary index
稠密索引 dense idnex:索引條目與資料記錄一一對應
稀疏索引 sparse index:索引條目與資料頁一一對應(與資料記錄為一對多關係)

ISAM: Indexed Sequential Access Method
ISAM結構示意圖:

ISAM結構示意圖非頁節點稱為分隔符級,一個分隔符節點示意圖如下:

ISAM分隔符節點示意圖其中Pn為指向下一級節點的指標,Kn為搜尋碼的值。Pi-1指向的K值<Ki<=Pi指向的K值

ISAM的分隔符級節點一旦建立便不再更改,因此ISAM被稱為靜態索引。葉子頁中的條目被除時其空間不會釋放,相關的分隔符級也不會更新,即可能出現分隔符級頁中出現的某些search key在葉子節點上沒有對應條目。插入時葉子頁使用fill factor和overflow chain
ISAM對相對靜態的表有效,動態表通常不用ISAM索引

B+ Tree
B+ tree結構示意圖:

B+ tree結構示意圖根節點到達任何一個葉子頁的級數是一樣的。葉子頁新增了兄弟指標,方便range search,支援範圍搜尋、等值搜尋、部分碼搜尋方式
葉子頁至少包含(n-1)/2個值,最多包含n-1個值。維護B+ Tree結構(插入、刪除操作等)演算法複雜
節點與ISAM類似:

B+ tree節點示意圖

Hash索引
只能等值搜尋,這種情況下比B+ tree更有效
也需要使用overflow chain
有靜態雜湊演算法、動態雜湊演算法(包括可擴充套件雜湊、線性雜湊)

Bit map 點陣圖索引
點陣圖索引一般用於低勢屬性(取值範圍很小的屬性)
為每一個取值建立一個點陣圖向量,每一位對應於資料的某一行。例如有PERSON表SEX列,取值範圍為(MALE, FEMALE),資料4000行,則將建立2個點陣圖向量V(male)、V(female),每個向量有4000位。如果V(male)i=1則表示第i 行記錄SEX列取值MALE
現在假如有這樣一個查詢:SEX='MALE' AND SMOKE='YES',如果這2個列都有點陣圖索引,則可以用V(sex-male) & V(smoker-yes)這個運算(位AND運算)得到滿足條件的行
點陣圖索引存在空間浪費,但特定情況下效率很高。另外點陣圖索引的維護成本比較高,因此不適合頻繁插入、更新的表

查詢優化器
Rule based optimizer:基於既定的規則優化查詢計劃
Cost-based optimizer:在RBO的基礎上增加統計資訊,結合評估成本與既定規則優化查詢計劃

事物
有關事務的部分內容可以參考事物、鎖、隔離等級
在資料庫理論中檢驗事物正確性以完全序列化執行結果為基準,考慮併發處理後採用兩階段封鎖協議(two-phase locking protocol, 2PL),訪問資源(讀、寫)時先申請鎖
考慮併發效能問題,鎖分成不同的粒度,典型的為表級鎖、頁級鎖、行級鎖

為什麼需要意向鎖?
因為有不同粒度的鎖存在,為了優化鎖衝突的判斷處理而設計出意向鎖
比如事物t1更新了某條記錄,對這條記錄加了寫鎖。而事物t2需要讀取這個表的所有記錄,需要對錶加讀鎖。事物控制器如何確定這2個事物的加鎖請求是否衝突?
有了意向鎖之後,事物t1在更新記錄時,對這個表加意向排他鎖IX(如果有頁鎖,則對資料記錄所在頁也加IX鎖);事物t2申請這個表上的共享鎖S時,就只需要檢測表(以及頁)上面已存在的鎖是否與S鎖衝突,而IX與S是衝突的,所以t2只有等待。這樣避免了鎖衝突判斷時需要理解並處理加鎖物件的型別以及之間的關係

意向鎖型別
IS, Intention Shared, 意向共享鎖:對行取讀鎖S時,則必須獲取表的IS鎖
IX, Intention Exclusive, 意向排他鎖:要更新某一行,則必須先獲取該表的IX鎖
SIX, Shared Intention Exclusive, 共享意向排他鎖:例如要更新某些行,但必須執行表掃描才能確定具體需要更新的行,則加SIX鎖,它是共享鎖與意向排他鎖的結合

先寫式日誌 Write-ahead log
更新記錄 update record:用於確保事物的原子性、永續性機制,事物終止(rollback)時可以根據更新記錄回滾。更新日誌中包含before image,即記錄被更新之前的狀態,因此可以用它來撤銷更改。因此更新記錄也被稱為undo record
日誌示意圖:

資料庫日誌示意圖 Ui:事物Ti的更新記錄 update record
Bi:事物Ti的開始記錄 begin record
Ci:事物Ti的開始記錄 commit record
Ai:事物Ti的開始記錄 abort record
CK:Check Point

   1. 終止事物時,在日誌中反向掃描處理到該事物的begin record就完成了
   2. 系統崩潰時需要將當時所有活動事物全部回滾(系統崩潰時記憶體資訊已經丟失,只能根據日誌操作),所以用commit record、abort record標識那些已經結束了的事物
      另外,除非反向掃描完整個日誌檔案,否則無法確定崩潰時哪些事物為活動事物,因此在日誌中定期記錄check point record,用來記錄檢查點時刻系統中所有活動的事物id。這樣崩潰恢復時只需要反向掃描到任何一個check point record就有方法確定掃描的終止條件

更新資料時,先更新資料檔案還是先寫日誌?
如果先更新資料檔案,在日誌檔案還沒有寫入時發生崩潰,則這個資料可能無法恢復;如果先寫日誌,在資料未更新時發生崩潰,則恢復處理不會造成資料錯誤。因此叫做write-ahead log
除了before image外,日誌可能還包括after image,即記錄更新之後的狀態,用於重做事物,因此也叫redo record。例如某時刻資料庫損壞,則可以用之前的某個備份加上redo log恢復到崩潰之前的某個狀態,將損失降到最低

相關文章