資料庫面試題
DBS DBMS DB區別
- DBS 資料庫系統
- DBMS 資料庫管理系統
- DB 資料庫
資料庫系統dbs包括但不限於資料庫管理系統dbms和資料庫db
MySQL儲存引擎
- InnoDB(預設):支援事物,表鎖,行鎖設計,支援外來鍵
- MyISAM:不支援事物和表鎖設計,不支援外來鍵
事物
-
使用場景
-
轉賬:
- a轉賬給b,a賬戶減少
- b賬戶增加
- 過程就要用到事物,轉賬事物就回滾
-
解釋:一組原子性的SQL查詢(結合ACID)
-
ACID特性
- A:原子性
- C:一致性
- I:隔離性
- D:永續性
-
隔離級別(低到高)
- read uncommitted(未提交讀)
- read committed(提交讀):大多數資料庫預設的級別
- repeatable read (可重複讀):mysql預設級別,解決了髒讀問題,InnoDB通過mvcc可解決幻讀問題
- serializable(可序列化):最高的隔離級別,不能併發,解決了幻讀問題,會產生超時 鎖爭用問題
樂觀鎖與悲觀鎖
- 悲觀鎖
- 特徵(what):每次運算元據都會加鎖
- 常見例子:mysql中行鎖 表鎖 讀鎖 寫鎖 ;java的中重量級鎖synchronized
- 樂觀鎖
- 特徵(what):運算元據時不加鎖
- 實現方法(how):通過版本控制和cas演算法實現
- 優點:適用於多讀的應用型別,可以提高吞吐量
- 常見例子:java中的原子變數類(cas演算法)
MVCC多版本併發控制
- 是啥(what):
- 可以認為是行級鎖的變種,他在很多情況下避免加鎖,花銷更低
- 分類:
- 樂觀併發控制和悲觀併發控制
- 實現(mysal的innodb引擎):
- 通過在每行記錄後面儲存兩個隱藏的列來實現,一個是儲存行的建立時間,一個是儲存行的過期時間。不過這裡的時間指的是系統版本號
死鎖(資料庫的)
- 解釋現象:兩個或兩個以上事務在同一資源相互佔用,並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。
併發控制
- 解決問題:我在讀資料,你在刪資料的情況
- 鎖分類:
- 讀鎖:共享鎖,不阻塞
- 寫鎖:排他鎖,排除其他寫鎖和讀鎖。
- 鎖策略
- 解決問題:提高效能
- 分類:
表鎖:開銷最小 行級鎖:最大程度支援併發,但開銷最大
正規化分類
- 1nf:屬性具有原子性
- 2nf:在1nf基礎上消除非主屬性對主碼的部分依賴
- 3nf:在2nf基礎上消除傳遞依賴
正規化與反正規化
-
正規化:
-
優點:
更新比反正規化快 修改資料少 表比較小,存在記憶體中,執行快
-
缺點:
需要關聯
-
-
反正規化:
-
優點:
避免關聯
-
缺點:
資訊冗餘
-
Char varchar
- Char是定長 剩餘空間會用空格填充
- Varchar是可變長
MySQL date、datetime和timestamp型別的區別
索引(書的目錄)
- 解決問題(why):方便查詢資料
- 優點:
- 大大減少伺服器需要掃描的資料量
- 幫助伺服器避免排序和臨時表
- 將隨機io變成順序io
- 缺點:
- 時間:建立索引,維護索引需要時間
- 空間:建立索引佔用物理空間
- 建立索引的原則
- 最左字首匹配原則,具體在聯合索引體現,mysql會一直向右匹配,當遇到範圍查詢會停止,此時把範圍查詢的索引放到最後即可
- 經常作為查詢的欄位作為索引
- 更新頻繁的欄位不適合做索引
- 定義有外來鍵的欄位一定要做索引
- 儘量擴充套件索引,不要重新新建索引
- 索引分類
-
按底層資料結構分:
b數索引(底層是b+數) 雜湊索引 空間資料(r-tree)索引 全文索引
-
按邏輯分類
主鍵索引(特殊的唯一索引,不允許null值) 單列索引 多列索引 唯一索引 空間索引
-
Group by
- 後面接條件時用having;
- 一般與**cout()**函式一起使用,實現查詢重複資料功能
- 查重:
- 結果
分頁查詢(limit(mysql) top(sqlserver))
-
解釋:limit x, y 表示從x+1行(x從0開始算)開始查詢y條資料
公眾號
- 歡迎關注公眾號 布林bl ,分享Java相關資訊科技、生活感悟。