面試題集錦
一、資料庫三大正規化
第一正規化(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機制:
- 儲存某個時間上的資料快照