面試題錦集:1、資料庫三大正規化,2、mysql索引型別及作用,3、事務的特性和隔離級別

kangshong發表於2023-04-03

面試題集錦

一、資料庫三大正規化

第一正規化(1NF):

指資料庫中表的每一列都是不可分割的最小單位

# 分割前:
		地址
	安徽省合肥市蜀山區
# 分割後:
	 省  | 市  |  區
	安徽省|合肥市|蜀山區

第二正規化(2NF):

如果表是單主鍵,那麼主鍵以外的列必須完全依賴於主鍵列,如果表是符合主鍵(聯合索引),那麼主鍵以外的列必須完全依賴於主鍵,而不是主鍵的一部份

第三正規化(3NF):

表中的非主鍵列必須直接依賴於主鍵列,而不是間接依賴於主鍵,也就是說非主鍵列不能間接依賴於主鍵列,出現這種情況應該在建立一張關聯表而不是存放在一張表中

二、mysql有哪些索引型別及作用

首先先說一下什麼是索引及索引的作用

在關係型資料庫中,給一個或多個欄位(聯合索引)設定索引,可以加快資料檢索(類似於目錄),達到快速查詢的作用

普通索引:

允許該欄位出現重複的值,且可以為空

唯一索引:

不允許該欄位出現重複值,且不可以為空

主鍵索引:

非空且唯一,在不主動生成的情況下資料庫會預設生成一個欄位為主鍵(一般是id欄位),非空且唯一

聯合索引:

多個欄位聯合唯一

全文索引:

所有欄位都作為索引條件,一般用的比較少,如果刪除或修改欄位可能照成B樹結構改變,在資料量龐大的情況下不建議使用(主要根據業務邏輯來判斷是否使用)

三、事務的特性和隔離級別

1、事務的四大特性

原子性(Atomicity):

事務一旦提交,要麼全部成功,要麼全部失敗

隔離性(Isolation):

事務之間相互隔離,不受影響

一致性(Consistency):

一個事務開啟後,在這個事務中多次查詢資料的結果都必須是一致的

永續性(Durable):

事務一旦提交,對資料的影響是永久的,不可回滾

2、事務的隔離級別

未提交讀(READ UNCOMMITTED):

事務的最低階別,會造成髒讀、不可重複讀、幻讀

已提交讀(READ COMMITTED):

該級別解決了髒讀,但不可重複讀和幻讀任然存在

可重複度(REPEATABLE READ):

該級別是mysql5.7版本後預設的事務級別,該級別解決了髒讀、不可重複度

序列化(SERIALIZABLE):

事務的最高階別,解決了髒讀、不可重複讀、幻讀,該級別極大的保證了資料的安全性,缺點是無併發可言

事務的隔離級別 髒讀 不可重複讀 幻讀
未提交讀(READ UNCOMMITTED)
已提交讀(READ COMMITTED) -
可重複度(REPEATABLE READ) - -
序列化(SERIALIZABLE) - - -

3、什麼是髒讀、不可重複度、幻讀

髒讀:

指A在事務的過程中可以讀取到B修改單位提交的資料

不可重複度:

指在同一個事務中,多次讀出資料,出現資料不一致的情況,這種情況通常是update和delete(資料前後不一致或開始時候讀取存在,後來就消失了)

幻讀:

很多人會把幻讀和不可重複讀混淆,幻讀指在同一個事務的過程中,多次讀取資料時,出現了新的資料(insert)

4、解決辦法

機制鎖:

  • ru:最低階別,不加鎖
  • rc:開啟事務時加行級鎖,讀到的時候加鎖,讀取完畢釋放鎖
  • rr:開啟事務時加行級鎖,關閉事務時釋放
  • se:開啟事務加表鎖,關閉事務釋放鎖

MVCC機制:

  • 儲存某個時間上的資料快照

相關文章