1. 對(duì) MySQL 的架構(gòu)了解嗎? MySQL 主要分為連接層,服務(wù)層,引擎層和存儲(chǔ)層。 - 連接層就是提供連接服務(wù)的,比如 JDBC 驅(qū)動(dòng);
- 服務(wù)層包括連接池、SQL 接口、解析器、優(yōu)化器等;
- 引擎層就是真正負(fù)責(zé)數(shù)據(jù)讀寫的,innoDB 就屬于引擎層;
- 存儲(chǔ)層就負(fù)責(zé)將數(shù)據(jù)存儲(chǔ)到文件系統(tǒng)。
2. MySQL 有哪些存儲(chǔ)引擎?有什么區(qū)別? 常見的有 InnoDB 和 MyISAM。 - InnoDB 支持行鎖,表鎖,事務(wù),使用聚簇索引,寫數(shù)據(jù)的效率比 MyISAM 更高。它有四個(gè)特性,插入緩沖,雙寫,自適應(yīng)哈希,預(yù)讀。插入緩沖就是插入數(shù)據(jù)之前會(huì)檢查緩沖中有沒有,沒有的話會(huì)先插入到緩沖中,有的話就會(huì)以一定的頻率將緩沖和索引頁(yè)合并;雙寫就是數(shù)據(jù)寫到磁盤前會(huì)先寫到緩存中,保證數(shù)據(jù)的可靠性;自適應(yīng)哈希就是存儲(chǔ)引擎會(huì)監(jiān)控索引頁(yè)的查詢,如果發(fā)現(xiàn)用 Hash 索引會(huì)提升性能,就會(huì)自動(dòng)建立 Hash 索引;預(yù)讀就是 InnoDB 會(huì)用算法預(yù)測(cè)用戶下次要讀取的數(shù)據(jù),提前加載到緩存池中,提升性能。
- MyISAM 只支持表鎖,不支持事務(wù),使用非聚簇索引,查詢的效率比 InnoDB 更高。
3. SQL 分為哪幾類?
- DDL:數(shù)據(jù)定義語(yǔ)言,比如 create、drop、alter、truncate;
- DQL:數(shù)據(jù)查詢語(yǔ)言,比如 select;
- DML:數(shù)據(jù)操縱語(yǔ)言,比如 insert、update、delete;
- DCL:數(shù)據(jù)控制語(yǔ)言,比如 grant、revoke(刪除權(quán)限)、commit、rollback。
4. 刪除數(shù)據(jù)有哪幾種方式,有什么區(qū)別? drop、truncate、delete 都可以刪除數(shù)據(jù)。 - drop 會(huì)刪除表結(jié)構(gòu),不能回滾,效率最高;
- truncate 刪除所有數(shù)據(jù),不會(huì)刪除表結(jié)構(gòu),不能回滾,效率次之;
- delete 刪除部分或所有數(shù)據(jù),不會(huì)刪除表結(jié)構(gòu),可以回滾,效率最差。
5. 對(duì) MySQL 的三大范式了解嗎?
- 第二范式就是在第一范式的基礎(chǔ)上,非主鍵列都完全依賴主鍵;
- 第三范式就是在第二范式的基礎(chǔ)上,任意兩個(gè)非主鍵列不能有依賴,確保非主鍵列都直接和主鍵列相關(guān),而不是間接相關(guān)。
6. 數(shù)據(jù)庫(kù)有哪些并發(fā)問題?
- 臟讀:一個(gè)事務(wù)讀取到了別的事務(wù)未提交的數(shù)據(jù);
- 寫丟失:事務(wù) A 和事務(wù) B 同時(shí)讀取到 age 為 18,然后事務(wù) A 將其改成 20,接著事務(wù) B 將其改成 16,最后數(shù)據(jù)庫(kù)中的是 16,事務(wù) A 的修改就丟失了;
- 不可重復(fù)讀:一個(gè)事務(wù)對(duì)同一條數(shù)據(jù)多次讀取的結(jié)果不一樣,可能是在此期間別的事務(wù)修改過;
- 幻讀:一個(gè)事務(wù)內(nèi),兩次查詢出來的記錄條數(shù)不一樣,就像發(fā)生了幻覺一樣。
7. 數(shù)據(jù)庫(kù)事務(wù)有什么特性? 數(shù)據(jù)庫(kù)事務(wù)有四大特性,ACID: - 原子性(A):一組操作不能再切分,要么全部成功,要么全部失敗。它的原理是在 undo log 中記錄相反的操作,如果事務(wù)回滾了,就根據(jù) undo log 執(zhí)行相反的操作;
- 一致性(C):一個(gè)事務(wù)對(duì)數(shù)據(jù)修改的中間狀態(tài)對(duì)別的事務(wù)不可見。比如轉(zhuǎn)賬操作,A 賬戶減少 100 元,B 賬戶又還沒增加 100 元的這個(gè)中間狀態(tài)對(duì)外是不可見的;
- 隔離性(I):事務(wù)之間相互隔離,一個(gè)事務(wù)不會(huì)被其他事務(wù)干擾;
- 持久性(D):事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的操作是永久有效的。
8. 數(shù)據(jù)庫(kù)事務(wù)有哪些隔離級(jí)別?
- 讀未提交:一個(gè)事務(wù)可以讀取到別的事務(wù)未提交的數(shù)據(jù);
- 讀已提交:一個(gè)事務(wù)只能讀取別的事務(wù)已經(jīng)提交的數(shù)據(jù),可防止臟讀;
- 可重復(fù)讀:一個(gè)事務(wù)內(nèi)對(duì)同一條記錄多次讀取的結(jié)果一致,InnoDB 默認(rèn)的隔離級(jí)別,可防止臟讀和不可重復(fù)讀;
- 可串行化:事務(wù)串行執(zhí)行,可以防止臟讀、不可重復(fù)讀和幻讀。
9. MySQL 有哪幾種鎖? MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,BDB 支持表鎖和頁(yè)鎖。 - 行鎖:鎖定被操作的行,其他行不受影響,并發(fā)性好,加鎖開銷大;
- 表鎖:鎖定被操作的表,表中所有數(shù)據(jù)都受影響,并發(fā)性不好,加鎖開銷?。?/section>
- 頁(yè)鎖:鎖定一個(gè)數(shù)據(jù)頁(yè),其他頁(yè)不受影響,并發(fā)性和加鎖開銷介于行鎖和表鎖之間。
10. InnoDB 的行鎖算法有哪幾種?
- Gap Lock:間隙鎖,鎖定一個(gè)范圍,但是不包含記錄本身,為了防止幻讀;
- Next-key Lock:鎖定一個(gè)范圍,且包含記錄本身,也可防止幻讀。當(dāng)查詢索引含有唯一屬性時(shí),Next-key Lock 會(huì)變?yōu)?Record Lock。
|