關(guān)于數(shù)據(jù)庫(kù)的一些面試常問(wèn)問(wèn)題
前言:
本人22考研黨,已上岸,發(fā)一些復(fù)試準(zhǔn)備整理的資料作為對(duì)考研準(zhǔn)備的一個(gè)收尾。由于近幾年基本都是線上復(fù)試,線上的話會(huì)更加注重概念的考察,本人在復(fù)試準(zhǔn)備期間搜集了面試題,整理了很多資料。本文主要概括了數(shù)據(jù)庫(kù)在復(fù)試面試中可能會(huì)考察的一些問(wèn)題,僅供大家參考,如果對(duì)大家有幫助,希望大家點(diǎn)贊哦~
本文目前僅針對(duì)的是考研復(fù)試環(huán)節(jié),不涵蓋數(shù)據(jù)庫(kù)全部的知識(shí),祝大家復(fù)試順利。由于作者本人水平有限,若本文有任何不對(duì)歡迎大家留言指正!上岸不易,希望大家都能去到想去的地方,加油。
1. 關(guān)于鍵的概念
超鍵:在關(guān)系中能唯一標(biāo)識(shí)元組的屬性或?qū)傩约?。一個(gè)屬性可以為作為一個(gè)超鍵,多個(gè)屬性組合在一起也可以作為一個(gè)超鍵。超鍵包含候選鍵和主鍵。
候選鍵:是最小超鍵,即沒有冗余元素的超鍵。
主鍵:數(shù)據(jù)庫(kù)表中對(duì)儲(chǔ)存數(shù)據(jù)對(duì)象予以唯一和完整標(biāo)識(shí)的數(shù)據(jù)列或?qū)傩缘慕M合。一個(gè)數(shù)據(jù)列只能有一個(gè)主鍵,且主鍵的取值不能缺失,即不能為空值(Null)??蓮暮蜻x鍵中選擇一個(gè)作為主鍵
外鍵:在一個(gè)表中存在的另一個(gè)表的主鍵稱此表的外鍵。
主屬性:候選鍵中的所有屬性
非主屬性
2. 必須知道的基礎(chǔ)概念
(一)DB、DBMS、DBS、DBA
DB(數(shù)據(jù)庫(kù)):長(zhǎng)期存儲(chǔ)在計(jì)算機(jī)內(nèi)、有組織的、統(tǒng)一管理的相關(guān)數(shù)據(jù)的集合。
DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng)):數(shù)據(jù)庫(kù)管理系統(tǒng)是位于用戶與OS之間的一層數(shù)據(jù)管理軟件,它為用戶或應(yīng)用程序提供了訪問(wèn)DB的方法。
DBS(數(shù)據(jù)庫(kù)系統(tǒng)):數(shù)據(jù)庫(kù)系統(tǒng)DBS是實(shí)現(xiàn)有組織動(dòng)態(tài)地存儲(chǔ)大量關(guān)聯(lián)數(shù)據(jù),方便多用戶訪問(wèn)的計(jì)算機(jī)硬件、軟件和數(shù)據(jù)資源組成的系統(tǒng),即采用數(shù)據(jù)庫(kù)技術(shù)的計(jì)算機(jī)系統(tǒng)。
DBA(數(shù)據(jù)庫(kù)管理員)
(二)數(shù)據(jù)庫(kù)的表 —— 相當(dāng)于一個(gè)類
實(shí)體 數(shù)據(jù)庫(kù)中的一行,也稱為一條記錄,一個(gè)元組
屬性 數(shù)據(jù)庫(kù)中的一列,一個(gè)字段
3. 文件系統(tǒng)和數(shù)據(jù)庫(kù)管理系統(tǒng)的區(qū)別
文件系統(tǒng) 共享性差,冗余度大,獨(dú)立性差
數(shù)據(jù)庫(kù)管理系統(tǒng) 共享性高,可以使多個(gè)用戶同時(shí)訪問(wèn)數(shù)據(jù)庫(kù),減少了數(shù)據(jù)冗余度,具有較高的物理獨(dú)立性和邏輯獨(dú)立性,整體結(jié)構(gòu)化,用數(shù)據(jù)模型描述
4. 三級(jí)模式?
三級(jí)模式包括外模式、模式、內(nèi)模式;
模式描述了數(shù)據(jù)庫(kù)中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征;
外模式描述了用戶可見的局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征;
內(nèi)模式描述了數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)和存儲(chǔ)方式。
外模式/模式映像保證了數(shù)據(jù)的邏輯獨(dú)立性(應(yīng)用程序和數(shù)據(jù)庫(kù)的物理存儲(chǔ)是相互獨(dú)立的);
內(nèi)模式/模式映像的優(yōu)點(diǎn)保證了數(shù)據(jù)的物理獨(dú)立性(應(yīng)用程序和數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)是相互獨(dú)立的)。
5. 模型
概念模型:現(xiàn)實(shí)世界到信息世界的第一層抽象,是數(shù)據(jù)庫(kù)設(shè)計(jì)人員進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)的有力工具,也是設(shè)計(jì)人員和用戶進(jìn)行交流的語(yǔ)言。用ER圖描述概念模型。
邏輯模型:表達(dá)計(jì)算機(jī)實(shí)現(xiàn)觀點(diǎn)的DB全局邏輯結(jié)構(gòu)的模型。邏輯模型主要有層次、網(wǎng)狀、關(guān)系和對(duì)象模型4種。
關(guān)系模型:關(guān)系模型建立在嚴(yán)格的數(shù)學(xué)概念基礎(chǔ)上;關(guān)系模型的概念單一,無(wú)論實(shí)體還是實(shí)體間的聯(lián)系,都用關(guān)系表示,對(duì)數(shù)據(jù)的檢索和更新也是關(guān)系;關(guān)系模型的存取路徑對(duì)用戶透明,有更高的數(shù)據(jù)獨(dú)立性和安全性,同時(shí)也簡(jiǎn)化了程序員的工作和數(shù)據(jù)庫(kù)開發(fā)
6. 關(guān)系模型中的完整性約束
約束是執(zhí)行數(shù)據(jù)校驗(yàn)的規(guī)則,用于保證數(shù)據(jù)完整性的規(guī)則
實(shí)體完整性:關(guān)系模式中的主碼不能為空值;
參照完整是:關(guān)系模式中的外碼只能是空值或者另一關(guān)系模式的主碼;
用戶定義完整性:針對(duì)某一屬性的約束。
7. MYSQL架構(gòu)
MySQL主要分為Server層和存儲(chǔ)引擎層:
Server層:主要包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),比如存儲(chǔ)過(guò)程、觸發(fā)器、視圖,函數(shù)等,還有一個(gè)通用的日志模塊binglog日志模塊。
存儲(chǔ)引擎:主要負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取。server層通過(guò)api與存儲(chǔ)引擎進(jìn)行通信。
8. SQL特點(diǎn)
**綜合統(tǒng)一。**集DCL,DML,DDL于一體;
**高度非過(guò)程化。**使用SQL進(jìn)行數(shù)據(jù)操作時(shí),是需要提出“做什么”,而不需要指明怎么做;
**面向集合的操作方式。**操作的對(duì)象、查找結(jié)果都可以是元組的集合;
同一種語(yǔ)法結(jié)構(gòu)提供多種使用方式。既可以作為獨(dú)立的語(yǔ)言進(jìn)行交互,又可以作為嵌入式語(yǔ)言嵌入到更高級(jí)的語(yǔ)言程序中;
9. DDL,DML,DCL
DDL(數(shù)據(jù)庫(kù)定義語(yǔ)言):create、alter、drop等,定義DB三級(jí)結(jié)構(gòu)的語(yǔ)言
DML(數(shù)據(jù)庫(kù)操縱語(yǔ)言):對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)操作的語(yǔ)言,insert、update、delete等
DCL(數(shù)據(jù)庫(kù)控制語(yǔ)言):包含grant、 revoke等
10. 數(shù)據(jù)字典DD
數(shù)據(jù)字典是系統(tǒng)內(nèi)部的一組系統(tǒng)表,他記錄了數(shù)據(jù)庫(kù)所有的定義信息,包括關(guān)系模式定義,視圖定義,索引定義完整性約束定義等,是在需求分析階段建立的。
它包括數(shù)據(jù)項(xiàng),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)流,數(shù)據(jù)存儲(chǔ)和處理過(guò)程。
11. 外連接
外連接是指兩個(gè)表在進(jìn)行操作時(shí),不僅返回符合連接和查詢條件的元組,還返回不符合條件的一些元組;
左外連接(left join on): 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
全外連接(full outer join on 并集): 包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
12. 交叉連接
生成笛卡爾積-它不使用任何匹配或者選取條件,直接將一個(gè)數(shù)據(jù)源中的每個(gè)行與另一個(gè)數(shù)據(jù)源的每個(gè)行都一一匹配。
13. 關(guān)于索引
索引相當(dāng)于目錄,用于提高數(shù)據(jù)表的訪問(wèn)速度的一種數(shù)據(jù)結(jié)構(gòu)。
作用:數(shù)據(jù)存儲(chǔ)在磁盤上,查詢數(shù)據(jù)時(shí),如果沒有索引,會(huì)加載所有的數(shù)據(jù)到內(nèi)存然后依次檢索,有了索引不需要加載所有的數(shù)據(jù)
優(yōu)點(diǎn):
減少磁盤I/O次數(shù),降低數(shù)據(jù)庫(kù)IO成本;提高查詢速度,當(dāng)用分組和排序子句進(jìn)行查詢時(shí),可以顯著減少分組和排序的時(shí)間,降低CPU的消耗;加快表之間的連接。
缺點(diǎn):
索引存在磁盤上,占用一定的物理空間;當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增刪改時(shí),需要對(duì)索引進(jìn)行動(dòng)態(tài)的維護(hù),降低了數(shù)據(jù)維護(hù)的速度。且隨著數(shù)據(jù)量的增加,耗費(fèi)的時(shí)間也會(huì)增加。
索引分類:
聚簇索引 一般推薦用自增主鍵,保證空間利用率,減少頁(yè)分裂
非聚簇索引(二級(jí)索引) 用二級(jí)索引查需要回表操作(根據(jù)二級(jí)索引查到主鍵,再根據(jù)主鍵去主鍵索引查)
聚簇索引和非聚簇索引的區(qū)別:
聚簇索引葉子結(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)記錄,非聚簇索引葉子結(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)位置,不會(huì)影響數(shù)據(jù)表的物理存儲(chǔ)順序;一個(gè)表只能有一個(gè)聚簇,但可以多個(gè)非聚簇;使用聚簇查詢效率高,但增刪改操作效率比非聚簇低。
覆蓋索引:索引字段覆蓋了查詢語(yǔ)句涉及的字段,直接通過(guò)索引文件就可以返回查詢所需的數(shù)據(jù),不必通過(guò)回表操作。
回表:通過(guò)索引找到主鍵,再根據(jù)主鍵id去主鍵索引查。
索引下推:在根據(jù)索引查詢過(guò)程中就根據(jù)查詢條件過(guò)濾掉一些記錄,減少最后的回表操作。
索引設(shè)計(jì)原則
需要的時(shí)候:
經(jīng)常用于查詢的字段
經(jīng)常用于連接的字段
經(jīng)常需要排序的字段
不需要的時(shí)候:
基數(shù)小的表沒必要
區(qū)分度不高的字段不適合,比如性別
更新頻繁的不適合
為何用B+樹?
B+樹只在葉子結(jié)點(diǎn)儲(chǔ)存數(shù)據(jù),非葉子結(jié)點(diǎn)存索引,而一個(gè)結(jié)點(diǎn)就是磁盤一個(gè)內(nèi)存頁(yè),內(nèi)存頁(yè)大小固定,相比B樹這些可以存更多的索引結(jié)點(diǎn), 出度更大,樹高矮,查詢次數(shù)少,磁盤IO少。
14. 視圖
視圖是虛擬的表,本身并不存儲(chǔ)數(shù)據(jù),本質(zhì)可以看作是存儲(chǔ)起來(lái)的select語(yǔ)句
對(duì)視圖中的數(shù)據(jù)進(jìn)行增刪改,數(shù)據(jù)表中的數(shù)據(jù)會(huì)相應(yīng)地發(fā)生變化
視圖本身的刪除并不影響基表中的數(shù)據(jù)
視圖可以簡(jiǎn)化查詢,實(shí)現(xiàn)數(shù)據(jù)的安全
15. 存儲(chǔ)過(guò)程
預(yù)編譯的SQL語(yǔ)句,允許模塊化的設(shè)計(jì),創(chuàng)建一次可以多次調(diào)用
原理:存儲(chǔ)過(guò)程預(yù)先存儲(chǔ)在SQL服務(wù)器上,需要執(zhí)行時(shí),客戶端給服務(wù)器發(fā)送調(diào)用存儲(chǔ)過(guò)程的命令,服務(wù)端就可以把預(yù)先存儲(chǔ)好的一系列語(yǔ)句全部執(zhí)行
優(yōu)點(diǎn):簡(jiǎn)化操作,提高SQL語(yǔ)句的重用性,可以建立非常復(fù)雜的查詢,且比執(zhí)行單純的SQL語(yǔ)句要快
16. 觸發(fā)器
通過(guò)事件觸發(fā)執(zhí)行的特殊存儲(chǔ)過(guò)程,相當(dāng)于事件監(jiān)聽器,例如對(duì)一個(gè)表的數(shù)據(jù)操作會(huì)觸發(fā)另一個(gè)表的數(shù)據(jù)操作。是保證數(shù)據(jù)庫(kù)完整性的一種方法。任何用戶對(duì)表進(jìn)行增刪改操作都會(huì)有數(shù)據(jù)庫(kù)服務(wù)器自動(dòng)激活相應(yīng)的觸發(fā)器,對(duì)數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的檢查和操作。
17. 數(shù)據(jù)庫(kù)的范式
1NF 要求數(shù)據(jù)庫(kù)每一列都是不可再分的原子值
2NF 消除了非主屬性對(duì)主屬性的部分函數(shù)依賴,所有非主鍵字段必須完全依賴于主鍵字段,不能只依賴主鍵的一部分。
3NF 消除了非主屬性對(duì)主屬性的傳遞函數(shù)依賴,每一列數(shù)據(jù)必須和主鍵直接相關(guān),不能間接相關(guān),也就是說(shuō),所有非主鍵字段不能依賴于其他非主鍵字段
BCNF 基本排除了所有屬性對(duì)碼的部分函數(shù)依賴和傳遞函數(shù)依賴
18. 函數(shù)依賴
是指關(guān)系中一個(gè)或一組屬性的值可以決定其它屬性的值
如果屬性集合X中每個(gè)屬性的值構(gòu)成的集合唯一地決定了屬性集合Y中每個(gè)屬性的值構(gòu)成的集合,則屬性集合Y函數(shù)依賴于屬性集合X,計(jì)為:X→Y
例:身份證號(hào)→姓名或者一個(gè)學(xué)生實(shí)體中有學(xué)號(hào),性別,姓名。給了學(xué)號(hào)就唯一確定了其他屬性。
非平凡函數(shù)依賴: 如果X→Y,但是Y不屬于X集合,則X→Y是非平凡函數(shù)依賴。
完全函數(shù)依賴:在一個(gè)屬性集合U中,如果X→Y,并且對(duì)于X的真子集X’都不能確定Y,只有X才能確定Y,那么成Y對(duì)X完全函數(shù)依賴。否則稱之為部分函數(shù)依賴。
19. Armstrong公理
包含三個(gè)推理規(guī)則:自反律,增廣律和傳遞律
在關(guān)系模式中,F(xiàn)所邏輯蘊(yùn)含的函數(shù)依賴的全體稱之為F的閉包F+
有效性指的是:由數(shù)據(jù)依賴F出發(fā)根據(jù)Armstrong公理推導(dǎo)除了的每一個(gè)函數(shù)依賴都一定在F+中。
完備性指的是:F閉包中的每一個(gè)函數(shù)依賴,必定可以有F出發(fā)根據(jù)Armstrong公理推導(dǎo)出來(lái)。
20. 概念模型與E-R圖
**概念:**用于信息世界的建模,是現(xiàn)實(shí)世界到信息世界的第一層抽象,是數(shù)據(jù)庫(kù)設(shè)計(jì)人員進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)的有力工具,也是數(shù)據(jù)庫(kù)設(shè)計(jì)人員和用戶之間進(jìn)行交流的語(yǔ)言,通常用E-R圖描述
三要素:
實(shí)體:現(xiàn)實(shí)世界的個(gè)體,可以獨(dú)立存在,矩形表示
屬性:實(shí)體的特性,不可再分,橢圓形表示
關(guān)系:實(shí)體之間的聯(lián)系,菱形表示
轉(zhuǎn)換關(guān)系:
一個(gè)實(shí)體通常轉(zhuǎn)換成-一個(gè) 數(shù)據(jù)表;
一個(gè)多對(duì)多的關(guān)系,通常也轉(zhuǎn)換成一個(gè)數(shù)據(jù)表;
一個(gè)1對(duì)1,或者1對(duì)多的關(guān)系,往往通過(guò)表的外鍵來(lái)表達(dá),而不是設(shè)計(jì)一個(gè)新的數(shù)據(jù)表;
屬性轉(zhuǎn)換成表的字段。
合并沖突:
屬性沖突。不同的實(shí)體對(duì)同一屬性的定義不同;
命名沖突。同名異義、異名同義;
結(jié)構(gòu)沖突。同一實(shí)體在不同的局部E-R圖中有不同的抽象。
21. 數(shù)據(jù)庫(kù)設(shè)計(jì)的基本步驟(了解每個(gè)步驟的大致內(nèi)容)
需求分析(功能分析)
概念結(jié)構(gòu)設(shè)計(jì)(ER圖)
邏輯結(jié)構(gòu)設(shè)計(jì)(ER圖到表)
物理結(jié)構(gòu)設(shè)計(jì)(存儲(chǔ)結(jié)構(gòu))
數(shù)據(jù)庫(kù)實(shí)施(測(cè)試、試運(yùn)行)
數(shù)據(jù)庫(kù)運(yùn)行和維護(hù)
22. 事務(wù)及其特性
數(shù)據(jù)庫(kù)進(jìn)行操作的基本單位
原子性:事務(wù)是一個(gè)不可分割的單位,要么全做,要么全不做;
一致性:事務(wù)執(zhí)行的結(jié)果必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài);
隔離性:一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)所干擾;
永久性:一旦事務(wù)被提交,它對(duì)數(shù)據(jù)庫(kù)的改變就是永久的。
23. 數(shù)據(jù)庫(kù)的安全性和安全性技術(shù)
安全性是指防止數(shù)據(jù)庫(kù)被惡意破壞和非法存取
實(shí)現(xiàn)數(shù)據(jù)庫(kù)安全性控制的常用方法和技術(shù)有:
(1)用戶標(biāo)識(shí)和鑒別:該方法由系統(tǒng)提供一定的方式讓用戶標(biāo)識(shí)自己咱勺名字或身份。每次用戶要求進(jìn)入系統(tǒng)時(shí),由系統(tǒng)進(jìn)行核對(duì),通過(guò)鑒定后才提供系統(tǒng)的使用權(quán)。
(2)存取控制:通過(guò)用戶權(quán)限定義和合法權(quán)檢查確保只有合法權(quán)限的用戶訪問(wèn)數(shù)據(jù)庫(kù),所有未被授權(quán)的人員無(wú)法存取數(shù)據(jù)。
存取控制兩種方法:
自主存取控制(DAC):用戶對(duì)不同的數(shù)據(jù)庫(kù)對(duì)象有不同的存取權(quán)限,不同的用戶對(duì)同一對(duì)象也有不同的權(quán)限
強(qiáng)制存取控制(MAC):每一個(gè)數(shù)據(jù)庫(kù)對(duì)象被標(biāo)以一定的密級(jí),每一個(gè)用戶也被授予一定級(jí)別的許可證,只有具有合法許可證的用戶才可以進(jìn)行存取。
(3)視圖機(jī)制:為不同的用戶定義視圖,通過(guò)視圖機(jī)制把要保密的數(shù)據(jù)對(duì)無(wú)權(quán)存取的用戶隱藏起來(lái),從而自動(dòng)地對(duì)數(shù)據(jù)提供一定程度的安全保護(hù)。
(4)審計(jì):建立審計(jì)日志,把用戶對(duì)數(shù)據(jù)庫(kù)的所有操作自動(dòng)記錄下來(lái)放人審計(jì)日志中,DBA可以利用審計(jì)跟蹤的信息,重現(xiàn)導(dǎo)致數(shù)據(jù)庫(kù)現(xiàn)有狀況的一系列事件,找出非法存取數(shù)據(jù)的人、時(shí)間和內(nèi)容等。
(5)數(shù)據(jù)加密:對(duì)存儲(chǔ)和傳輸?shù)臄?shù)據(jù)進(jìn)行加密處理,從而使得不知道解密算法的人無(wú)法獲知數(shù)據(jù)的內(nèi)容。
24. 完整性、安全性的區(qū)分
數(shù)據(jù)庫(kù)的完整性是指為了防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義的數(shù)據(jù),防止錯(cuò)誤信息的輸入和輸出。
數(shù)據(jù)庫(kù)的安全性是保護(hù)數(shù)據(jù)庫(kù)防止惡意的破壞和非法的存取。
總結(jié)來(lái)說(shuō),數(shù)據(jù)庫(kù)安全性措施的防范對(duì)象是非法用戶和非法操作,數(shù)據(jù)庫(kù)的完整性措施的防范對(duì)象是不合語(yǔ)義的數(shù)據(jù)
25. 數(shù)據(jù)冗余?怎么避免?
數(shù)據(jù)冗余最容易出現(xiàn)的就是:當(dāng)同一條數(shù)據(jù)存儲(chǔ)在兩個(gè)或多個(gè)單獨(dú)的位置時(shí),特別容易產(chǎn)生數(shù)據(jù)冗余。備份數(shù)據(jù)也會(huì)產(chǎn)生數(shù)據(jù)冗余,錯(cuò)誤的數(shù)據(jù)也會(huì)發(fā)生數(shù)據(jù)冗余。
怎么避免:對(duì)數(shù)據(jù)進(jìn)行規(guī)范化管理,采取更為嚴(yán)格的數(shù)據(jù)庫(kù)范式,比如BCNF范式或者第四范式。逐步消除數(shù)據(jù)依賴中不合理的地方,設(shè)計(jì)更為高效的數(shù)據(jù)庫(kù)。還可以組織數(shù)據(jù)庫(kù)的序列,對(duì)數(shù)據(jù)進(jìn)行分類存儲(chǔ)。
26. 數(shù)據(jù)庫(kù)恢復(fù)技術(shù)
數(shù)據(jù)轉(zhuǎn)儲(chǔ):DBA定期將數(shù)據(jù)庫(kù)復(fù)制到其他介質(zhì)上進(jìn)行保存,這些備份的數(shù)據(jù)叫做后備副本;
登記日志文件,日志文件是用來(lái)記錄事物對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新操作的文件。
利用后備副本和日志文件,可以將數(shù)據(jù)庫(kù)恢復(fù)到某個(gè)一致性狀態(tài)。
登記日志文件時(shí)為什么必須先寫日志文件,后寫數(shù)據(jù)庫(kù)?
如果先寫了數(shù)據(jù)庫(kù)修改,而在運(yùn)行記錄中沒有登記這個(gè)修改,則以后就無(wú)法恢復(fù)這個(gè)修改了。
如果先寫日志,但沒有修改數(shù)據(jù)庫(kù),在恢復(fù)時(shí)并不會(huì)影響數(shù)據(jù)庫(kù)的正確性。
27. 數(shù)據(jù)庫(kù)故障種類
事務(wù)故障、系統(tǒng)故障、介質(zhì)故障;
事務(wù)故障是指事務(wù)在運(yùn)行至終點(diǎn)前被中止;事務(wù)故障恢復(fù)是由系統(tǒng)自動(dòng)完成,利用日志文件撤銷此事務(wù)已對(duì)數(shù)據(jù)庫(kù)進(jìn)行的修改;
系統(tǒng)故障是指造成系統(tǒng)停止運(yùn)轉(zhuǎn)的任何事件,使得系統(tǒng)要重新啟動(dòng);系統(tǒng)故障的恢復(fù)是在重新啟動(dòng)后系統(tǒng)自動(dòng)完成,為了防止系統(tǒng)故障造成的數(shù)據(jù)不一致性,必須撤銷故障時(shí)未完成的事物,重做已完成的事物;
介質(zhì)故障是指磁盤上的物理數(shù)據(jù)和日志文件被破壞;介質(zhì)故障的恢復(fù)方法就是重裝數(shù)據(jù)庫(kù),重做已經(jīng)完成的事物。
28. 日志
bin log記錄對(duì)MySQL數(shù)據(jù)庫(kù)執(zhí)行修改的所有操作,不會(huì)記錄select和show語(yǔ)句,主要用于恢復(fù)數(shù)據(jù)庫(kù)和同步數(shù)據(jù)庫(kù)。
redo log用來(lái)記錄innodb存儲(chǔ)引擎的事務(wù)日志,不管事務(wù)是否提交都會(huì)記錄下來(lái),用于數(shù)據(jù)恢復(fù)。當(dāng)數(shù)據(jù)庫(kù)發(fā)生故障,innoDB存儲(chǔ)引擎會(huì)使用redo log恢復(fù)到發(fā)生故障前的時(shí)刻,以此來(lái)保證數(shù)據(jù)的完整性。
進(jìn)行數(shù)據(jù)修改時(shí)還會(huì)記錄undo log,undo log用于數(shù)據(jù)的撤回操作,它保留了記錄修改前的內(nèi)容。通過(guò)undo log可以實(shí)現(xiàn)事務(wù)回滾,并且可以根據(jù)undo log回溯到某個(gè)特定的版本的數(shù)據(jù)。
29. 并發(fā)造成的數(shù)據(jù)不一致
丟失修改:A、B兩個(gè)事物同時(shí)對(duì)一個(gè)數(shù)據(jù)進(jìn)行操作,A的修改破壞了B的修改,導(dǎo)致B的修改丟失;
不可重復(fù)讀:兩次讀到數(shù)據(jù)不一致。A讀取了數(shù)據(jù)后,B對(duì)數(shù)據(jù)進(jìn)行了修改,導(dǎo)致A無(wú)法再現(xiàn)前一次的讀取結(jié)果;
臟讀:讀到了未提交的數(shù)據(jù)。A對(duì)數(shù)據(jù)進(jìn)行了修改之后,B讀入該數(shù)據(jù),然后A又因?yàn)槟骋辉虺蜂N了該修改,導(dǎo)致數(shù)據(jù)恢復(fù)原值,此時(shí)B讀取的數(shù)據(jù)就成了臟數(shù)據(jù)。
30. 排他鎖、共享鎖
鎖是防止其他事務(wù)訪問(wèn)指定資源,實(shí)現(xiàn)并發(fā)控制的一種手段。
排他鎖(X寫鎖):當(dāng)數(shù)據(jù)被加上排他鎖,其他事務(wù)不能對(duì)該數(shù)據(jù)進(jìn)行讀和寫;
共享鎖(S讀鎖):當(dāng)數(shù)據(jù)被加上共享鎖,允許其他事務(wù)對(duì)該數(shù)據(jù)進(jìn)行讀,不允許寫。
31. 樂(lè)觀鎖、悲觀鎖
悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突,在查詢完數(shù)據(jù)的時(shí)候就把事務(wù)鎖起來(lái),直到提交事務(wù)。實(shí)現(xiàn)方式:使用數(shù)據(jù)庫(kù)中的鎖機(jī)制。
樂(lè)觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突,只在提交操作時(shí)檢查數(shù)據(jù)是否被修改過(guò)。給表增加version字段,在修改提交之前檢查version與原來(lái)取到的version值是否相等,若相等,表示數(shù)據(jù)沒有被修改,可以更新,否則,數(shù)據(jù)為臟數(shù)據(jù),不能更新。實(shí)現(xiàn)方式:樂(lè)觀鎖一般使用版本號(hào)機(jī)制或CAS算法實(shí)現(xiàn)。
32. 三級(jí)封鎖協(xié)議
一級(jí)封鎖協(xié)議:事務(wù)在修改數(shù)據(jù)之前加寫鎖,直到事務(wù)結(jié)束才釋放。該協(xié)議可以防止丟失修改;
二級(jí)封鎖協(xié)議:在一級(jí)封鎖協(xié)議的基礎(chǔ)上,加上了事務(wù)在讀取數(shù)據(jù)之前對(duì)其加讀鎖,讀完后即可釋放讀鎖。該協(xié)議避免了讀臟數(shù)據(jù);
三級(jí)封鎖協(xié)議:在一級(jí)封鎖協(xié)議的基礎(chǔ)上,加上了事務(wù)在讀取數(shù)據(jù)之前必須加上讀鎖,直到事務(wù)結(jié)束才釋放。該協(xié)議解決了不可重復(fù)讀問(wèn)題。
33. SQL操作語(yǔ)句(可跟據(jù)復(fù)試內(nèi)容的傾向選擇是否復(fù)習(xí),當(dāng)然都是一些比較基礎(chǔ)的數(shù)據(jù)庫(kù)操作語(yǔ)句,在實(shí)操中是必不可少的)
數(shù)據(jù)庫(kù)基本操作
#查看數(shù)據(jù)庫(kù)
show databases
#創(chuàng)建數(shù)據(jù)庫(kù)
create database db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
#使用數(shù)據(jù)庫(kù)
use db;
用戶
#創(chuàng)建用戶
create user ‘用戶名’@‘IP地址’ identified by ‘密碼’;
#刪除用戶
drop user ‘用戶名’@‘IP地址’;
#修改用戶
rename user ‘用戶名’@‘IP地址’; to ‘新用戶名’@‘IP地址’;;
#修改密碼
set password for ‘用戶名’@‘IP地址’ = Password(‘新密碼’)
創(chuàng)建用戶時(shí):
用戶名:創(chuàng)建的用戶名稱
IP地址:指定用戶可以從哪個(gè)服務(wù)器登陸,本地用戶localhost,任意遠(yuǎn)程機(jī)用“%”
密碼:該用戶登陸的密碼
權(quán)限
#查看權(quán)限:
show grants for ‘用戶’@‘IP地址’
#授權(quán):
grant 權(quán)限 on 數(shù)據(jù)庫(kù).表 to ‘用戶’@‘IP地址’
#取消授權(quán):
revoke 權(quán)限 on 數(shù)據(jù)庫(kù).表 from ‘用戶’@‘IP地址’
權(quán)限:用戶的操作權(quán)限,如SELECT,INSERT,UPDATE等,如果要授予所的權(quán)限則使用ALL,例如:
GRANT SELECT, INSERT ON student.user TO ‘javayz’@‘%’;
通過(guò)下面的命令讓指定用戶可以給其他用戶授權(quán)
GRANT privileges ON databasename.tablename TO ‘username’@‘host’ WITH GRANT OPTION;
對(duì)表的操作
#查詢所有的表
show tables;
#創(chuàng)建表
CREATE TABLE user
(id
int(11) NOT NULL auto_increment, # not null表示不能為空,auto_increment表示自增name
varchar(255) DEFAULT ‘javayz’, # default 表示默認(rèn)值
PRIMARY KEY (id
) # 把id列設(shè)置成主鍵
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#查看表信息
DESC 表名
#清空表
truncate table 表名
#刪除表
drop table 表名
#添加列
alter table 表名 add 列名 類型
#刪除列
alter table 表名 drop column 列名
#修改列類型
alter table 表名 modify column 列名 類型;
#修改列名、列類型
alter table 表名 change 原列名 新列名 類型;
#添加主鍵
alter table 表名 add primary key(列名);
#刪除主鍵
alter table 表名 drop primary key;
#添加外鍵
alter table 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段);
#刪除外鍵
alter table 表名 drop foreign key 外鍵名稱
#修改默認(rèn)值
ALTER TABLE user ALTER name SET DEFAULT ‘javayz2’;
#刪除默認(rèn)值
ALTER TABLE user ALTER name DROP DEFAULT;
對(duì)數(shù)據(jù)的操作
基礎(chǔ)增刪改查:
#增
insert into 表 (列名,列名…) values (值,值,…)
#刪
delete from 表 where 條件
#改
update 表 set 字段=‘值’ where 條件
#查
select 值 from 表 where 條件
其他條件:
#通配符like %匹配多個(gè)字符,匹配單個(gè)字符
select * from 表 where name like '%java’
#limit 限制輸出行數(shù)
select * from 表 limit 3 #前3行
select * from 表 limit 3,5; #從第3行開始的5行文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-422751.html
#order by 排序
select * from 表 order by 列 asc #asc正序,desc逆序
#group by分組(group by 必須在where之后,order by之前)
select name from 表 group by name文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-422751.html
到了這里,關(guān)于數(shù)據(jù)庫(kù)面試常問(wèn)——for考研復(fù)試面試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!