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