以下是《數(shù)據(jù)庫程序員面試筆試寶典-機(jī)械工業(yè)出版社》的一些筆記整理。
待完成: 關(guān)系型數(shù)據(jù)庫完整性規(guī)則理肺,事務(wù)的分類巍膘,XA協(xié)議,CAP定理狐史;更新丟失
關(guān)系型數(shù)據(jù)庫完整性規(guī)則:實體完整性規(guī)則(主鍵不能為空)痒给;參照完整性規(guī)則(外鍵必須在其對應(yīng)的主鍵中能找到或者是空值);用戶自定義完整性規(guī)則
約束(Constraint)類型:主鍵(Primary Key)約束骏全,唯一約束(Unique)苍柏,檢查約束,非空約束姜贡,外鍵(Foreign Key)約束
事務(wù)
事務(wù)(Transaction)的概念:是一個操作序列试吁,不可分割的工作單位,以BEGIN TRANSACTION開始楼咳,以ROLLBACK/COMMIT結(jié)束
事務(wù)的特性(ACID特性):原子性(邏輯上是不可分割的操作單元熄捍,要么都執(zhí)行要么都不執(zhí)行);一致性:根據(jù)實際情況滿足一致性狀態(tài)母怜;隔離性:針對并發(fā)事務(wù)而言余耽,隔離并發(fā)運行的多個事務(wù)間的相互干擾;持久性:一旦事務(wù)提交成功苹熏,對數(shù)據(jù)的修改是永久性的
-
事務(wù)的分類:
- 扁平事務(wù)(Flat Transaction):所有操作處于同一層次碟贾,其間的操作是原子性的。主要限制是不能提交或回滾事務(wù)的某一部分
- 帶有保存點(Savepoints)的扁平事務(wù):支持回滾到保存點
- 鏈?zhǔn)聞?wù)(Chained Transaction):一個事務(wù)由多個子事務(wù)鏈?zhǔn)浇M成轨域。在提交一個事務(wù)時袱耽,釋放不需要的數(shù)據(jù)對象,前一個事務(wù)的提交操作和下一個事務(wù)的開始操作合并成一個原子操作干发;與帶有保存點的扁平事務(wù)的不同之處:鏈?zhǔn)聞?wù)中的回滾只限于當(dāng)前事務(wù)朱巨;鏈?zhǔn)聞?wù)在執(zhí)行COMMIT之后即釋放了當(dāng)前所持有的鎖
- 嵌套事務(wù)(Nested Transaction):層次結(jié)構(gòu)框架,由一個頂層事務(wù)控制著各個層次的事務(wù)(子事務(wù))
- 分布式事務(wù)(Distributed):分布式環(huán)境下運行的扁平事務(wù)枉长,需要根據(jù)數(shù)據(jù)所在位置訪問網(wǎng)絡(luò)中不同結(jié)點的數(shù)據(jù)庫資源冀续。也稱XA事務(wù),XA是一個分布式事務(wù)協(xié)議
XA協(xié)議:主要定義了事務(wù)管理器(Transaction Manager)和資源管理器(Resource Manager)之間的接口搀暑。XA事務(wù)是基于兩階段提交(Two-phase commit,2pc)協(xié)議實現(xiàn)的沥阳,準(zhǔn)備階段和提交階段
-
事務(wù)的四種隔離級別:當(dāng)多個線程都開啟事務(wù)操作數(shù)據(jù)庫中的數(shù)據(jù)時,數(shù)據(jù)庫需要進(jìn)行隔離操作自点,以保證數(shù)據(jù)準(zhǔn)確性桐罕。如果不考慮事務(wù)的隔離性,則會出現(xiàn)以下問題:
- 臟讀(Dirty Read):一個事務(wù)讀取了被另一個事務(wù)(正在多次)修改、但尚未提交的數(shù)據(jù)功炮,造成兩個事務(wù)得到的數(shù)據(jù)不一致
- 不可重復(fù)讀(Nonrepeatable Read):在同一個事務(wù)中溅潜,某查詢操作在一個時間讀取某一行數(shù)據(jù)和之后一個時間讀取該行數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)已經(jīng)發(fā)生修改(可能被更新或刪除了)
- 幻讀(Phantom Read):當(dāng)同一查詢多次執(zhí)行時薪伏,由于其它的插入操作的事務(wù)提交滚澜,會導(dǎo)致每次返回不同的結(jié)果集(和不可重復(fù)讀的區(qū)別:針對的是一個數(shù)據(jù)整體)
-
四種隔離級別(級別提高并發(fā)性能降低):
- 未提交讀(Read Uncommited):該隔離級別中,所有事務(wù)都可以看到其它未提交事務(wù)的執(zhí)行結(jié)果嫁怀。不能避免上述三個問題
- 提交讀(Read Commited):Oracle數(shù)據(jù)庫的默認(rèn)隔離級別设捐。一個事務(wù)只能看見已經(jīng)提交的事務(wù)所作的改變√潦纾可避免臟讀問題
- 可重復(fù)讀(Repeatable Read):MySQL的默認(rèn)隔離級別(MySQL設(shè)置語句:
SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL READ COMMITED
)萝招。可以確保同一個事務(wù)在多次讀取同樣的數(shù)據(jù)時得到相同的結(jié)果存捺,解決了前兩個問題 - 可串行化(Serializable):通過強(qiáng)制事務(wù)排序槐沼,強(qiáng)制事務(wù)串行執(zhí)行,使之不可能相互沖突捌治,從而解決幻讀問題岗钩。可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭肖油,實際很少使用兼吓。
CAP定理:在一個分布式系統(tǒng)中,一致性(Consistancy)(所有結(jié)點在同一時間的數(shù)據(jù)完全一致)森枪、可用性(Availability)(服務(wù)一直可用)周蹭、分區(qū)容錯性(Partition Tolerance)(某結(jié)點故障不影響服務(wù)的提供)三者不可兼得。最多只能得其二疲恢。CA數(shù)據(jù)庫(如圖書管理系統(tǒng))/CP數(shù)據(jù)庫(如火車售票系統(tǒng))/AP數(shù)據(jù)庫(如博客)
-
數(shù)據(jù)庫的三級模式/三個抽象級別(數(shù)據(jù)庫內(nèi)部的體系結(jié)構(gòu)):
- 外模式(External Schema):也叫子模式或用戶模式,面向具體的應(yīng)用程序瓷胧,是數(shù)據(jù)庫用戶最終能看見和使用的視圖
- 模式(Schema):也叫邏輯模式显拳,數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)的描述
- 內(nèi)模式(Internal Schema):也稱存儲模式,是數(shù)據(jù)物理結(jié)構(gòu)和存儲方式的描述搓萧,依賴于邏輯結(jié)構(gòu)杂数,獨立于具體的用戶視圖和存儲設(shè)備。比如是否加密存儲瘸洛,壓縮存儲揍移,使用B-tree還是哈希
-
二級映像
- 外模式/模式映像:外模式與模式之間的對應(yīng)關(guān)系,當(dāng)模式改變時反肋,只需要相應(yīng)改變映像那伐,而外模式可保持不變。體現(xiàn)了邏輯獨立性
- 模式/內(nèi)模式映像:數(shù)據(jù)庫邏輯結(jié)構(gòu)與存儲結(jié)構(gòu)之間的對應(yīng)關(guān)系。物理獨立性
封鎖類型:排他鎖(X鎖):事務(wù)對數(shù)據(jù)加上X鎖時罕邀,只允許此事務(wù)讀取和修改此數(shù)據(jù)畅形;共享鎖(S鎖):加了S鎖后,該事務(wù)和其它事務(wù)只能對數(shù)據(jù)進(jìn)行讀取而不能修改诉探,直到該事務(wù)釋放S鎖
-
三級封鎖協(xié)議:
- 一級:事務(wù)在修改數(shù)據(jù)之前必須先對其加X鎖日熬,直到事務(wù)結(jié)束才釋放∩隹瑁可防止丟失修改(不能解決臟讀問題竖席??)
- 二級:事務(wù)在讀取數(shù)據(jù)之前必須先加S鎖敬肚,讀完后釋放毕荐。可防止臟讀帘皿,不能保證可重復(fù)讀
- 三級:事務(wù)讀取數(shù)據(jù)之前加S鎖东跪,事務(wù)結(jié)束后釋放梯轻,防止了不可重復(fù)讀
兩段鎖協(xié)議:事務(wù)必須嚴(yán)格分為兩個階段對數(shù)據(jù)進(jìn)行加鎖和解鎖的操作锄奢,第一階段加鎖,第二階段解鎖我衬。也就是說一個事務(wù)中一旦釋放了鎖曹动,就不能再申請新鎖了
鎖
用于管理對共享資源的并發(fā)訪問斋日,保證數(shù)據(jù)庫的完整性和一致性
更新丟失:一個事務(wù)對數(shù)據(jù)的更新把另一個事務(wù)的更新覆蓋了,只有第四級隔離可以防止墓陈,但效率太低恶守。更新丟失分兩類:第一類:在A事務(wù)撤銷時,把已經(jīng)提交的B事務(wù)的更新覆蓋了贡必;第二類:在A事務(wù)提交時覆蓋了B已經(jīng)提交的更新
悲觀鎖:每次讀取數(shù)據(jù)之前都會上鎖兔港,防止其它事務(wù)讀取或修改數(shù)據(jù);應(yīng)用于數(shù)據(jù)更新比較頻繁的場景
樂觀鎖:查詢數(shù)據(jù)時不會上鎖仔拟,但是更新時會判斷在此期間有沒有別的事務(wù)更新這個數(shù)據(jù)衫樊,一般通過時間戳字段實現(xiàn)
-
SQL server中鎖的分類:
- 共享鎖(share lock):執(zhí)行SELECT時,數(shù)據(jù)庫會自動使用S鎖
- 排他鎖(exclusive lock):執(zhí)行INSERT/UPDATE/DELETE時自動使用
- 更新鎖(update lock):意味著事務(wù)即將使用X鎖利花?
- 意向鎖(intent lock):科侈?
- 架構(gòu)鎖(schema lock,Sch鎖):
- 大容量更新鎖(bulk update lock):允許多個線程將數(shù)據(jù)并發(fā)大容量加載到同一個表
死鎖(具體知識看操作系統(tǒng)部分):多個進(jìn)程發(fā)生等待(阻塞)時炒事,每個都在等待被其它進(jìn)程占用的資源臀栈;產(chǎn)生條件:互斥條件(一個資源一次只能被一個進(jìn)程占用);請求與保持條件(當(dāng)一個進(jìn)程因請求資源而被阻塞時挠乳,對已獲得的資源不會釋放)权薯;不可剝奪條件(進(jìn)程已獲得的資源姑躲,在使用完之前,不能強(qiáng)行被剝奪)崭闲;循環(huán)等待條件(若干進(jìn)程之間形成一種首尾相接的循環(huán)等待資源關(guān)系)
活鎖:事務(wù)等待時間太長肋联,似乎被鎖住了,實際上有可能激活
MVCC(Multi-Version Concurrent Control刁俭,多版本并發(fā)控制):更新數(shù)據(jù)時橄仍,不會直接覆蓋數(shù)據(jù),而是生成一個新的版本的數(shù)據(jù)牍戚,但是同一時刻只有最新的版本號是有效的
存儲過程:用戶定義的一系列SQL語句的集合侮繁,針對特定表和特定對象
觸發(fā)器:允許用戶定義一組操作,但是其是不能被直接調(diào)用的如孝,而是由一個事件來觸發(fā)運行宪哩,比如增/刪/改等操作。用于保證數(shù)據(jù)完整性第晰。在數(shù)據(jù)庫里以獨立的對象存儲锁孟。不能接受參數(shù)。濫用會造成維護(hù)困難
游標(biāo):用于定位在結(jié)果集的特定行茁瘦,以對特定行進(jìn)行操作而不是整個結(jié)果集
視圖:從數(shù)據(jù)庫的基本表中由查詢選取出來的數(shù)據(jù)組成的虛擬表品抽。數(shù)據(jù)庫中只會存放視圖的定義。隱藏了數(shù)據(jù)的復(fù)雜性甜熔,可控制對某些機(jī)密數(shù)據(jù)的訪問提高了安全性
索引(Index)
對某列創(chuàng)建索引(生成獨立的索引表圆恤,方式如排序)可以大大加快檢索速度,缺點是耗費時間和空間以及更新索引很慢腔稀。主鍵和外鍵必須有索引
-
在哪些地方創(chuàng)建索引:
- WHERE子句或連接條件經(jīng)常引用的列
- 某列經(jīng)常作為最大最小值
- 經(jīng)常被查詢并按一定規(guī)則返回
- 經(jīng)常出現(xiàn)在ORDER BY/GROUP BY/DISDINCT后面的字段
- 只應(yīng)建立在小字段上盆昙,而不要對大文本或圖片建立索引
唯一索引(Unique Indexes)/非唯一(Nonunique)索引:索引值是否唯一
聚集(Clustered)索引/非聚集索引:對磁盤上存放數(shù)據(jù)的物理地址重新組織以使這些數(shù)據(jù)按照指定規(guī)則排序的一種索引(數(shù)據(jù)的物理排列順序和索引排列順序一致)。因此每張表只能創(chuàng)建一個聚集索引(因為要改變物理存儲順序)焊虏。優(yōu)點是查詢速度快淡喜,因為可以直接按照順序得到需要數(shù)據(jù)的物理地址。缺點是進(jìn)行修改的速度較慢诵闭。對于需要經(jīng)常搜索范圍的值很有效拆火。非聚集索引只記錄邏輯順序,并不改變物理順序涂圆。兩者都用B+Tree來描述,非聚集索引的葉結(jié)點存放的是指向數(shù)據(jù)塊的指針
單列索引/復(fù)合(Composite)索引:基于單個列或多列建立的索引
位圖(Bitmap)索引
分區(qū)(Partitioned)索引/非分區(qū)索引:把一個索引分成多個片段币叹,可以訪問更小的片段润歉。二叉樹和位圖索引都可以分區(qū),哈希索引不能分區(qū)颈抚。分區(qū)索引又分為本地分區(qū)索引和全局分區(qū)索引
覆蓋(Covering)索引:一個索引包含了所有滿足查詢所需要的數(shù)據(jù)踩衩,查詢的時候只需要讀取索引而不需要回表讀取數(shù)據(jù)
虛擬(Virtual)索引:模擬索引的存在而不用真正創(chuàng)建一個索引嚼鹉,用于快速測試創(chuàng)建索引對執(zhí)行計劃的影響。沒有相關(guān)的索引段驱富,不增加存儲空間的使用
不可見(Invisible)索引
E-R模型
數(shù)據(jù)字典
數(shù)據(jù)庫安全
熱備份:在數(shù)據(jù)庫運行的情況下锚赤,采用歸檔方式備份的方法。優(yōu)點:可按表或用戶備份褐鸥,備份時數(shù)據(jù)庫仍可使用线脚,可恢復(fù)至任一時間點。但是不能出錯
冷備份:數(shù)據(jù)庫正常關(guān)閉后叫榕,將關(guān)鍵性文件復(fù)制到另一位置的備份方式浑侥。優(yōu)點:操作簡單快速,恢復(fù)簡單
OLTP(OnLine Transaction Processing晰绎,聯(lián)機(jī)事務(wù)處理):主要是執(zhí)行基本的事務(wù)寓落,如增刪改,一般對實時性要求高荞下,數(shù)據(jù)量不是很大伶选,并發(fā)性要求高
OLAP(OnLine Analytical Processing,聯(lián)機(jī)分析處理):支持復(fù)雜的分析操作尖昏,側(cè)重決策支持
數(shù)據(jù)庫連接池:負(fù)責(zé)分配仰税、管理和釋放數(shù)據(jù)庫連接,允許應(yīng)用程序重復(fù)使用現(xiàn)有的連接而不需要重新建立連接会宪。有最小連接數(shù)和最大連接數(shù)肖卧。連接池將數(shù)據(jù)庫連接到中間服務(wù)器上,這樣應(yīng)用程序每次連接時就只需要操作服務(wù)器上的連接