数据库面试题
數據庫面試題
DBS DBMS DB區別
數據庫系統dbs包括但不限于數據庫管理系統dbms和數據庫db
MySQL存儲引擎
事物
- 使用場景
-
轉賬:
- 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引擎):
- 通過在每行記錄后面保存兩個隱藏的列來實現,一個是保存行的創建時間,一個是保存行的過期時間。不過這里的時間指的是系統版本號
死鎖(數據庫的)
- 解釋現象:兩個或兩個以上事務在同一資源相互占用,并請求鎖定對方占用的資源,從而導致惡性循環的現象。
并發控制
- 解決問題:我在讀數據,你在刪數據的情況
-
鎖分類:
- 讀鎖:共享鎖,不阻塞
- 寫鎖:排他鎖,排除其他寫鎖和讀鎖。
鎖策略
- 解決問題:提高性能
-
分類:
表鎖:開銷最小
行級鎖:最大程度支持并發,但開銷最大
范式分類
范式與反范式
-
范式:
-
優點:
更新比反范式快
修改數據少
表比較小,存在內存中,執行快 -
缺點:
需要關聯
-
反范式:
-
優點:
避免關聯
-
缺點:
信息冗余
-
Char varchar
- Char是定長 剩余空間會用空格填充
- Varchar是可變長
MySQL date、datetime和timestamp類型的區別
- https://zhuanlan.zhihu.com/p/...
索引(書的目錄)
- 解決問題(why):方便查找數據
-
優點:
- 大大減少服務器需要掃描的數據量
- 幫助服務器避免排序和臨時表
- 將隨機io變成順序io
缺點:
- 時間:創建索引,維護索引需要時間
- 空間:創建索引占用物理空間
-
創建索引的原則
- 最左前綴匹配原則,具體在聯合索引體現,mysql會一直向右匹配,當遇到范圍查詢會停止,此時把范圍查詢的索引放到最后即可
- 經常作為查詢的字段作為索引
- 更新頻繁的字段不適合做索引
- 定義有外鍵的字段一定要做索引
- 盡量擴展索引,不要重新新建索引
-
索引分類
-
按底層數據結構分:
b數索引(底層是b+數)
哈希索引
空間數據(r-tree)索引
全文索引 -
按邏輯分類
主鍵索引(特殊的唯一索引,不允許null值)
單列索引
多列索引
唯一索引
空間索引
-
Group by
- 后面接條件時用having;
- 一般與cout()函數一起使用,實現查詢重復數據功能
- 查重:
- 結果
分頁查詢(limit(mysql) top(sqlserver))
- 練習:
https://www.nowcoder.com/prac... - 解釋:limit x, y 表示從x+1行(x從0開始算)開始查詢y條數據
公眾號
- 歡迎關注公眾號 布爾bl ,分享Java相關信息技術、生活感悟。
總結
- 上一篇: 函数习题
- 下一篇: MYSQL GROUP BY 对多个字段