數據庫面試題
![](http://static.javashuo.com/static/loading.gif)
DBS DBMS DB區別
- DBS 數據庫系統
- DBMS 數據庫管理系統
- DB 數據庫
數據庫系統dbs包括但不限於數據庫管理系統dbms和數據庫dbjava
MySQL存儲引擎
- InnoDB(默認):支持事物,表鎖,行鎖設計,支持外鍵
- MyISAM:不支持事物和表鎖設計,不支持外鍵
事物
- 使用場景
-
轉帳:mysql
- a轉帳給b,a帳戶減小
- b帳戶增長
- 過程就要用到事物,轉帳事物就回滾
- 解釋:一組原子性的SQL查詢(結合ACID)
-
ACID特性面試
-
隔離級別(低到高)算法
- read uncommitted(未提交讀)
- read committed(提交讀):大多數數據庫默認的級別
- repeatable read (可重複讀):mysql默認級別,解決了髒讀問題,InnoDB經過mvcc可解決幻讀問題
- serializable(可串行化):最高的隔離級別,不能併發,解決了幻讀問題,會產生超時 鎖爭用問題
樂觀鎖與悲觀鎖
-
悲觀鎖sql
- 特徵(what):每次操做數據都會加鎖
- 常見例子:mysql中行鎖 表鎖 讀鎖 寫鎖 ;java的中重量級鎖synchronized
-
樂觀鎖數據庫
- 特徵(what):操做數據時不加鎖
- 實現方法(how):經過版本控制和cas算法實現
- 優勢:適用於多讀的應用類型,能夠提升吞吐量
- 常見例子:java中的原子變量類(cas算法)
MVCC多版本併發控制
-
是啥(what):服務器
- 能夠認爲是行級鎖的變種,他在不少狀況下避免加鎖,花銷更低
-
分類:數據結構
-
實現(mysal的innodb引擎):併發
- 經過在每行記錄後面保存兩個隱藏的列來實現,一個是保存行的建立時間,一個是保存行的過時時間。不過這裏的時間指的是系統版本號
死鎖(數據庫的)
- 解釋現象:兩個或兩個以上事務在同一資源相互佔用,並請求鎖定對方佔用的資源,從而致使惡性循環的現象。
併發控制
- 解決問題:我在讀數據,你在刪數據的狀況
-
鎖分類:mvc
- 讀鎖:共享鎖,不阻塞
- 寫鎖:排他鎖,排除其餘寫鎖和讀鎖。
鎖策略
-
-
分類:
表鎖:開銷最小
行級鎖:最大程度支持併發,但開銷最大
範式分類
- 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()函數一塊兒使用,實現查詢重複數據功能
- 查重:
![FX0qfO.png FX0qfO.png](http://static.javashuo.com/static/loading.gif)
![FX0vXd.png FX0vXd.png](http://static.javashuo.com/static/loading.gif)
分頁查詢(limit(mysql) top(sqlserver))
公衆號
- 歡迎關注公衆號 布爾bl ,分享Java相關信息技術、生活感悟。
![](http://static.javashuo.com/static/loading.gif)