前言:
1.什麼是關係型資料庫?談談你對 MySQL 的認識。
這是一道基礎題,考察面試者對資料庫的瞭解程度,一般可以簡單講下自己的認知,有條理即可。比如:
關係型資料庫是指採用了關係模型來組織資料的資料庫,其以行和列的形式儲存資料。關係型資料庫最大的特點是支援事務。常見的關係型資料庫有 MySQL、Oracle、SQLServer 等。MySQL 是當下最流行的開源資料庫。由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,使得很多公司都採用 MySQL 資料庫以降低成本,目前被廣泛地應用在 Internet 上的中小型網站中,尤其適用於 OLTP 領域。
2.MySQL 常見的儲存引擎有哪些,有什麼區別?
這個問題也經常被問到,和『InnoDB 與 MyISAM 引擎的區別』問題相似。
常見的幾種儲存引擎:
InnoDB: MySQL 預設的儲存引擎,支援事務、MVCC、外來鍵、行級鎖和自增列。MyISAM: 支援全文索引、壓縮、空間函式、表級鎖,不支援事務,插入速度快。Memory: 資料都在記憶體中,資料的處理速度快,但是安全性不高。ARCHIVE: 常用於歷史歸檔表,佔用空間小,資料不能更新刪除。InnoDB 與 MyISAM 引擎的幾點區別:
InnoDB 支援事務,MyISAM 不支援事務。InnoDB 支援外來鍵,而 MyISAM 不支援。InnoDB 不支援全文索引,而 MyISAM 支援。InnoDB 是聚簇索引,MyISAM 是非聚簇索引。InnoDB 不儲存表的具體行數,而 MyISAM 用一個變數儲存了整個表的行數。InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。儲存結構不同,MyISAM 表分為 frm MYD MYI 三個,InnoDB 一般分為 frm ibd 兩個。3.描述下 MySQL 基礎架構。
這個問題考察面試者對 MySQL 架構的瞭解,和『一條 select 語句執行流程』問題相似。
MySQL的邏輯架構主要分為3層:
第一層:對客戶端的連線處理、安全認證、授權等,每個客戶端連線都會在服務端擁有一個執行緒,每個連線發起的查詢都會在對應的單獨執行緒中執行。第二層:MySQL的核心服務功能層,包括查詢解析、分析、查詢快取、內建函式、儲存過程、觸發器、檢視等,select操作會先檢查是否命中查詢快取,命中則直接返回快取資料,否則解析查詢並建立對應的解析樹。第三層:儲存引擎,負責資料的儲存和提取,MySQL伺服器透過API與儲存引擎通訊,遮蔽了各種引擎之間的差異,常見的儲存引擎有:InnoDB、MyISAM。一條 select 語句執行流程:
客戶端透過聯結器與 MySQL 伺服器建立連線,並獲取了使用者的讀寫許可權,然後提交查詢語句。首先 MySQL 會在查詢快取中對提交的語句進行查詢,如果命中且使用者對錶有操作許可權,會直接返回查詢快取中查詢結果作為本次查詢的結果,查詢到此結束。如果查詢快取未命中,會來到分析器,分析器會解析語句並檢查其合法性。如果語句不符合 MySQL 的語法規範,執行器會報錯,查詢到此結束。若語句合法,會來到最佳化器,最佳化器會為 SQL 語句選擇最優的執行計劃。最後來到執行器,如果使用者對錶有操作許可權,執行器會呼叫儲存引擎提供的介面來執行 SQL 語句,然後將查詢結果返回給客戶端,查詢到此結束。4.說說常用的幾種欄位型別。
這個問題考察面試者對 MySQL 欄位型別的瞭解程度,可以延伸出很多小問題,例如 char 與 varchar 的區別。
常用的欄位型別分類:
數值型:
字串型別:
日期和時間型別:
int(M)中的 M 代表最大顯示寬度,"最大顯示寬度"我們第一反應是該欄位的值最大能允許存放的值的寬度,以為我們建了int(1),就不能存放資料10了, 其實不是這個意思,int(5)和int(10)可儲存的範圍一樣。
CHAR型別是定長的,MySQL總是根據定義的字串長度分配足夠的空間。當儲存CHAR值時,在它們的右邊填充空格以達到指定的長度,當檢索到CHAR值時,尾部的空格被刪除掉。VARCHAR型別用於儲存可變長字串,儲存時,如果字元沒有達到定義的位數,也不會在後面補空格。char(M) 與 varchar(M)中的的 M 都表示儲存的最大字元數,單個字母、數字、中文等都是佔用一個字元。
5.講講索引的作用及結構及使用規範。
關於索引,能有好多好多問題,可能幾篇文章也寫不明白。簡單分享下這類問題的回答:
索引的目的在於提高查詢效率。可以類比字典中的目錄,查詢字典內容時可以根據目錄查詢到資料的存放位置,然後直接獲取即可。索引是表的目錄,在查詢內容之前可以先在目錄中查詢索引位置,以此快速定位查詢資料。
InnoDB 引擎下,主要使用的是 B+Tree 索引,每個索引其實都是一顆B+樹,B+樹是為了磁碟及其他儲存輔助裝置而設計的一種平衡查詢樹(不是二叉樹),在B+樹中,所有的資料都在葉子節點,且每一個葉子節點都帶有指向下一個節點的指標,形成了一個有序的連結串列。
從物理儲存角度來看,InnoDB 索引可分為聚簇索引(clustered index)和二級索引(secondary index)或輔助索引。聚簇索引的葉子節點存的是整行資料,當某條查詢使用的是聚簇索引時,只需要掃描聚簇索引一顆B+樹即可得到所需記錄,如果想透過二級索引來查詢完整的記錄的話,需要透過回表操作,也就是在透過二級索引找到主鍵值之後再到聚簇索引中查詢完整的記錄。
索引的優點顯而易見是可以加速查詢,但建立索引也是有代價的。首先每建立一個索引都要為它建立一棵B+樹,會佔用額外的儲存空間;其次當對錶中的資料進行增加、刪除、修改時,索引也需要動態的維護,降低了資料的維護速度。所以,索引的建立及使用是有原則的,一般只為用於搜尋、排序、分組、連線的列建立索引,選擇性差的列儘量不建立索引。
6.講下 MySQL 事務的特性及隔離級別。
MySQL 事務相關問題也經常被問到,一些原理性的東西還是需要深入去學習的。
ACID 四個特性:
A(Atomicity,原子性):一個事務中的操作要麼都成功,要麼都失敗。C(Consistency,一致性):資料庫總是從一個一致性狀態轉換到另一個一致性狀態,若破壞約束,則不滿足一致性條件。I(Isolation,隔離性):一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。D(Durability,永續性):事務在提交以後,它所做的修改就會被永久儲存到資料庫。事務隔離級別:
讀未提交(Read Uncommitted):事務中的修改,即便沒有提交,對其他事務也都是可見的。讀已提交(Read Committed):事務中的修改只有在提交之後,才會對其他事務可見。可重複讀(Repeatable Read):一個事務中多次查詢相同的記錄,結果總是一致的(預設的隔離級別)。可序列化(Serializable):事務都是序列執行的,讀會加讀鎖,寫會加寫鎖。併發事務帶來的問題:
髒讀(Dirty Reads):事務A讀取了事務B未提交的資料,然後B回滾操作,那麼A讀取到的資料是髒資料。不可重複讀(Non-Repeatable Reads):事務 A 多次讀取同一資料,事務B在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果不一致。幻讀(Phantom Reads):幻讀與不可重複讀類似。它發生在一個事務A讀取了幾行資料,接著另一個併發事務B插入了一些資料時。在隨後的查詢中,事務A就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣,所以稱為幻讀。參考:
https://juejin.cn/post/6895526108729442318