前言
題目彙總來源 史上最全各類面試題彙總,沒有之一,不接受反駁
- 面試題彙總一 Java 語言基礎篇
- 面試題彙總二 Java 多線程篇
- 面試題彙總三 Java 集合篇
- 面試題彙總四 JVM 篇
- 面試題彙總五 Spring 篇
- 面試題彙總六 數據庫篇
- 面試題彙總七 計算機網絡篇
目錄
請簡潔描述Mysql中InnoDB支持的四種事務隔離級別名稱,以及逐級之間的區別?
Mysql 的存儲引擎 myisam 和 innodb 的區別。
樂觀鎖和悲觀鎖是什麼,INNODB的標準行級鎖有哪2種,解釋其含義。
數據庫
請簡潔描述Mysql中InnoDB支持的四種事務隔離級別名稱,以及逐級之間的區別?
不可重複讀側重的是對數據的修改,而幻讀側重的是對數據的增加和刪除;解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
在Mysql中ENUM的用法是什麼?
enum 在數據庫底層以整型方式儲存,從 1 開始,0 用於指代空或錯誤的字符串。
CREATE TABLE student(
id INT(11) PRIMARY key auto_increment,
name VARCHAR(10) not null,
sex ENUM('boy','girl','secret') DEFAULT 'secret'
)ENGINE=INNODB
SELECT * FROM student WHERE sex=[1|'boy'];
CHAR和VARCHAR的區別?
char 固定長度 255,不足的部分補空格,取出時再去掉空格。
varchar 不定長度。
事務是如何通過日誌來實現的,說得越深入越好
redo和undo。
基本流程如下:
因爲事務在修改頁時,要先記 undo,在記 undo 之前要記 undo 的 redo, 然後修改數據頁,再記數據頁修改的 redo。 Redo(裏面包括 undo 的修改) 一定要比數據頁先持久化到磁盤。 當事務需要回滾時,因爲有 undo,可以把數據頁回滾到前鏡像的狀態,崩潰恢復時,如果 redo log 中事務沒有對應的 commit 記錄,那麼需要用 undo把該事務的修改回滾到事務開始之前。 如果有 commit 記錄,就用 redo 前滾到該事務完成時並提交掉。
drop,delete與truncate的區別
drop,delete與truncate的區別(刪除表的方式,哪個快)
drop 刪表,delete 刪表中的數據,truncate 清空表。
truncate、drop 是DDL,不記入日誌,不能回滾;delete 是 DML,記入日誌,能回滾
局部性原理與磁盤預讀
由於存儲介質的特性,磁盤本身存取就比主存慢很多,再加上機械運動耗費,磁盤的存取速度往往是主存的幾百分分之一,因此爲了提高效率,要儘量減少磁盤I/O。爲了達到這個目的,磁盤往往不是嚴格按需讀取,而是每次都會預讀,即使只需要一個字節,磁盤也會從這個位置開始,順序向後讀取一定長度的數據放入內存。這樣做的理論依據是計算機科學中著名的局部性原理:當一個數據被用到時,其附近的數據也通常會馬上被使用。程序運行期間所需要的數據通常比較集中。
由於磁盤順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有局部性的程序來說,預讀可以提高I/O效率。
預讀的長度一般爲頁(page)的整倍數。頁是計算機管理存儲器的邏輯塊,硬件及操作系統往往將主存和磁盤存儲區分割爲連續的大小相等的塊,每個存儲塊稱爲一頁(在許多操作系統中,頁的大小通常爲4k),主存和磁盤以頁爲單位交換數據。當程序要讀取的數據不在主存中時,會觸發一個缺頁異常,此時系統會向磁盤發出讀盤信號,磁盤會找到數據的起始位置並向後連續讀取一頁或幾頁載入內存中,然後異常返回,程序繼續運行。
數據庫範式
第一範式
如果一個關係模式的所有屬性的域都是原子的,稱這個關係模式屬於第一範式。關係中每一分量不可再分。
不能以集合、序列等作爲屬性值。
sdudent_number | course_number |
---|---|
s1 | {c1,c2,c3} |
sdudent_number | course_number |
---|---|
s1 | c1 |
s1 | c2 |
s1 | c3 |
第二範式
一個關係模式滿足第一範式的前提下,且每個屬性滿足以下條件之一:
- 它出現在一個候選碼之中;
- 它沒有部分依賴於某候選碼;
稱之爲第二範式。
消除非主屬性對碼的部分依賴。
// 不滿足第二範式
// 學號,學生姓名,學院編號,學院,課程編號,分數
關係模式 S(sno , sname, dno , dean , cno, score)
主碼 (sno, cno)
(sno,cno) -p-> sname
(sno,cno) -p-> dno
// 滿足第二範式
SC(sno , cno , score)
S_SD(sno , sname ,dno , dean)
第三範式
滿足第二範式,消除非主屬性對碼的傳遞依賴。
// 不滿足第三範式
S_SD(sno , sname ,dno , dean)
sno -> dno -> dean
// 滿足第三範式
S (sno , sname , dno)
D (dno , dean)
BCNF
滿足3NF,消除每一屬性對候選鍵的傳遞依賴。
存儲過程與觸發器的區別
觸發器與存儲過程非常相似,觸發器也是SQL語句集,兩者唯一的區別是觸發器不能用EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發(激活)執行。觸發器是在一個修改了指定表中的數據時執行的存儲過程。通常通過創建觸發器來強制實現不同表中的邏輯相關數據的引用完整性和一致性。由於用戶不能繞過觸發器,所以可以用它來強制實施複雜的業務規則,以確保數據的完整性。觸發器不同於存儲過程,觸發器主要是通過事件執行觸發而被執行的,而存儲過程可以通過存儲過程名稱名字而直接調用。當對某一表進行諸如UPDATE、INSERT、DELETE這些操作時,SQLSERVER就會自動執行觸發器所定義的SQL語句,從而確保對數據的處理必須符合這些SQL語句所定義的規則。
鎖的優化策略
爲什麼Mysql用B+樹做索引而不用B樹
B樹與B+樹的區別:
- B樹每個索引節點都可以存放數據;B+樹非葉節點只存放索引,僅在葉節點存放數據。
爲什麼使用B+樹:
- B樹節點既存放索引也存放數據,想要定位數據要進行更多次磁盤I/O;B+樹索引節點僅存放索引,能快速定位數據,減少I/O次數。
- B+樹葉節點可以使用指針串聯,方便遍歷和範圍查找。
爲什麼不使用平衡二叉樹或紅黑樹:
- 磁盤I/O次數與樹深度有關,B樹比二叉樹深度低,I/O次數更少。
B樹/B+樹插入刪除
什麼情況下設置了索引但無法使用
MYSQL 索引類型、什麼情況下用不上索引、什麼情況下不推薦使用索引
- 條件中使用了 or,而相關列不全有索引
- 條件中使用了and,而相關列不滿足最左原則
- 索引列的數據類型出現隱形轉換
- like查詢是以%開頭
- where 子句裏對索引列上有數學運算/函數
- mysql估計使用全表掃描要比使用索引快
什麼情況下不宜建立索引?
- 數據唯一性差(一個字段的取值只有幾種時)的字段不要使用索引
- 頻繁更新的字段不要使用索引
- 字段不在where語句出現時不要添加索引,如果where後含IS NULL /IS NOT NULL/ like ‘%輸入符%’等條件,不建議使用索引
- where 子句裏對索引列使用不等於(<>),使用索引效果一般
解釋MySQL外連接、內連接與自然連接的區別
外連接
左連接:連接兩張表,左表數據完全顯示,右表匹配,匹配不上的補null;
右連接:同上,換個方向;
全外連接:兩表字段都匹配,匹配不上的補null;
內連接
所有查詢出的結果都是能夠在連接的表中有對應記錄的。
自然連接
找到兩表的公共字段,然後和內連接一樣。
完整性約束包括哪些?
其他說法:
- 主鍵,外鍵,唯一,檢查,默認
- 主鍵,外鍵,唯一,檢查,非空
MySql不支持check
Mysql 的存儲引擎 myisam 和 innodb 的區別。
MySQL兩種存儲引擎: MyISAM和InnoDB 簡單總結
myisam | innodb | |
---|---|---|
事務支持 | 不支持 | 支持 |
存儲結構 | 三種文件 | 一種文件 |
存儲空間 | 體積小 | 體積大 |
可移植性 | 方便 | 困難 |
鎖力度 | 表級鎖 | 表級鎖,行級鎖 |
全文索引 | 支持 | 不支持 |
表主鍵 | 可以沒有 | 必須有,沒有就自動生成 |
外鍵 | 不支持 | 支持 |
如何進行SQL優化
首先參考上面的“索引失效”,儘可能在查詢時利用到索引。
其他有一些細碎的優化方式,比如:
- exists 代替 in
- 不要過多建索引,會降低插入和更新效率
- 少用 select *
- varchar 代替 char
- 不頻繁創建臨時表
樂觀鎖和悲觀鎖是什麼,INNODB的標準行級鎖有哪2種,解釋其含義。
悲觀鎖
悲觀鎖,也叫悲觀併發控制,當事務A對某行數據應用了鎖,並且當這個事務把鎖釋放後,其他事務才能夠執行與該鎖衝突的操作,這裏事務A所施加的鎖就叫悲觀鎖。
MySql 中悲觀鎖的實現:
select … for update
樂觀鎖
樂觀鎖,也叫樂觀併發控制,它假設多用戶併發的事務在處理時不會彼此互相影響,各事務能夠在不產生鎖的情況下處理各自影響的那部分數據。在提交數據更新之前,每個事務會先檢查在該事務讀取數據後,有沒有其他事務又修改了該數據。如果其他事務有更新的話,那麼當前正在提交的事務會進行回滾。
MySql 中樂觀鎖需要手寫邏輯:
SELECT data AS old_data, version AS old_version FROM …;
// 根據獲取的數據進行業務操作,得到new_data和new_version
UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
// 樂觀鎖獲取成功,操作完成
} else {
// 樂觀鎖獲取失敗,回滾並重試
}
標準行級鎖
- 共享鎖(S Lock):允許事務讀取一行數據。
- 排他鎖(X Lock):允許事務更新或刪除一行數據。
|
X 排它鎖 |
S 共享鎖 |
X 排它鎖 |
衝突 |
衝突 |
S 共享鎖 |
衝突 |
兼容 |
補充:意向鎖
- 意向共享鎖(IS Lock):事務想要獲得一張表中某幾行的共享鎖
- 意向排他鎖(IX Lock):事務想要獲得一張表中某幾行的排他鎖
|
X 排它鎖 |
S 共享鎖 |
IX 意向排它鎖 |
IS 意向共享鎖 |
X 排它鎖 |
衝突 |
衝突 |
衝突 |
衝突 |
S 共享鎖 |
衝突 |
兼容 |
衝突 |
兼容 |
IX 意向排它鎖 |
衝突 |
衝突 |
兼容 |
兼容 |
IS 意向共享鎖 |
衝突 |
兼容 |
兼容 |
兼容 |
MVCC的含義,如何實現的
MVCC是一種多版本併發控制機制。MVCC是通過保存數據在某個時間點的快照來實現的。
在每個表後添加創建版本號和刪除版本號,版本號爲修改該項的事務版本號。
讀取只能讀取創建版本號小於該事務版本號以及無刪除版本號或刪除版本號大於事務版本號的項。
update操作將就數據標記爲刪除,插入相同的新數據有新創建版本號。
MYSQL的主從延遲怎麼解決。