前言:
在各類技術(shù)崗位面試中锋叨,似乎 MySQL 相關(guān)問題經(jīng)常被問到菊匿。無論你面試開發(fā)崗位或運維崗位付呕,總會問幾道數(shù)據(jù)庫問題。經(jīng)常有小伙伴私信我捧请,詢問如何應(yīng)對 MySQL 面試題凡涩。其實很多面試題都是大同小異的,提前做準(zhǔn)備還是很有必要的疹蛉。本篇文章簡單說下幾個常見的面試題活箕,一起來學(xué)習(xí)下吧。
1.什么是關(guān)系型數(shù)據(jù)庫可款?談?wù)勀銓?MySQL 的認(rèn)識育韩。
這是一道基礎(chǔ)題,考察面試者對數(shù)據(jù)庫的了解程度闺鲸,一般可以簡單講下自己的認(rèn)知筋讨,有條理即可。比如:
關(guān)系型數(shù)據(jù)庫是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫摸恍,其以行和列的形式存儲數(shù)據(jù)悉罕。關(guān)系型數(shù)據(jù)庫最大的特點是支持事務(wù)。常見的關(guān)系型數(shù)據(jù)庫有 MySQL立镶、Oracle壁袄、SQLServer 等。MySQL 是當(dāng)下最流行的開源數(shù)據(jù)庫媚媒。由于其體積小嗜逻、速度快、總體擁有成本低缭召,尤其是開放源碼這一特點栈顷,使得很多公司都采用 MySQL 數(shù)據(jù)庫以降低成本逆日,目前被廣泛地應(yīng)用在 Internet 上的中小型網(wǎng)站中,尤其適用于 OLTP 領(lǐng)域萄凤。
2.MySQL 常見的存儲引擎有哪些室抽,有什么區(qū)別?
這個問題也經(jīng)常被問到蛙卤,和『InnoDB 與 MyISAM 引擎的區(qū)別』問題相似狠半。
常見的幾種存儲引擎:
- InnoDB: MySQL 默認(rèn)的存儲引擎,支持事務(wù)颤难、MVCC神年、外鍵、行級鎖和自增列行嗤。
- MyISAM: 支持全文索引已日、壓縮、空間函數(shù)栅屏、表級鎖飘千,不支持事務(wù),插入速度快栈雳。
- Memory: 數(shù)據(jù)都在內(nèi)存中护奈,數(shù)據(jù)的處理速度快,但是安全性不高哥纫。
- ARCHIVE: 常用于歷史歸檔表霉旗,占用空間小,數(shù)據(jù)不能更新刪除蛀骇。
InnoDB 與 MyISAM 引擎的幾點區(qū)別:
- InnoDB 支持事務(wù)厌秒,MyISAM 不支持事務(wù)。
- InnoDB 支持外鍵擅憔,而 MyISAM 不支持鸵闪。
- InnoDB 不支持全文索引,而 MyISAM 支持暑诸。
- InnoDB 是聚簇索引蚌讼,MyISAM 是非聚簇索引。
- InnoDB 不保存表的具體行數(shù)个榕,而 MyISAM 用一個變量保存了整個表的行數(shù)啦逆。
- InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖笛洛。
- 存儲結(jié)構(gòu)不同,MyISAM 表分為 frm MYD MYI 三個乃坤,InnoDB 一般分為 frm ibd 兩個苛让。
3.描述下 MySQL 基礎(chǔ)架構(gòu)沟蔑。
這個問題考察面試者對 MySQL 架構(gòu)的了解,和『一條 select 語句執(zhí)行流程』問題相似狱杰。
MySQL的邏輯架構(gòu)圖(來源:《MySQL實戰(zhàn)45講》)
MySQL的邏輯架構(gòu)主要分為3層:
- 第一層:對客戶端的連接處理瘦材、安全認(rèn)證、授權(quán)等仿畸,每個客戶端連接都會在服務(wù)端擁有一個線程食棕,每個連接發(fā)起的查詢都會在對應(yīng)的單獨線程中執(zhí)行。
- 第二層:MySQL的核心服務(wù)功能層错沽,包括查詢解析簿晓、分析、查詢緩存千埃、內(nèi)置函數(shù)憔儿、存儲過程、觸發(fā)器放可、視圖等谒臼,select操作會先檢查是否命中查詢緩存,命中則直接返回緩存數(shù)據(jù)耀里,否則解析查詢并創(chuàng)建對應(yīng)的解析樹蜈缤。
- 第三層:存儲引擎,負(fù)責(zé)數(shù)據(jù)的存儲和提取冯挎,MySQL服務(wù)器通過API與存儲引擎通信底哥,屏蔽了各種引擎之間的差異,常見的存儲引擎有:InnoDB织堂、MyISAM叠艳。
一條 select 語句執(zhí)行流程:
- 客戶端通過連接器與 MySQL 服務(wù)器建立連接,并獲取了用戶的讀寫權(quán)限易阳,然后提交查詢語句附较。
- 首先 MySQL 會在查詢緩存中對提交的語句進行查詢,如果命中且用戶對表有操作權(quán)限潦俺,會直接返回查詢緩存中查詢結(jié)果作為本次查詢的結(jié)果拒课,查詢到此結(jié)束。
- 如果查詢緩存未命中事示,會來到分析器早像,分析器會解析語句并檢查其合法性。如果語句不符合 MySQL 的語法規(guī)范肖爵,執(zhí)行器會報錯卢鹦,查詢到此結(jié)束。
- 若語句合法劝堪,會來到優(yōu)化器冀自,優(yōu)化器會為 SQL 語句選擇最優(yōu)的執(zhí)行計劃揉稚。
- 最后來到執(zhí)行器,如果用戶對表有操作權(quán)限熬粗,執(zhí)行器會調(diào)用存儲引擎提供的接口來執(zhí)行 SQL 語句搀玖,然后將查詢結(jié)果返回給客戶端,查詢到此結(jié)束驻呐。
4.說說常用的幾種字段類型灌诅。
這個問題考察面試者對 MySQL 字段類型的了解程度,可以延伸出很多小問題含末,例如 char 與 varchar 的區(qū)別猜拾。
常用的字段類型分類:
數(shù)值型:
字符串類型:
日期和時間類型:
int(M)中的 M 代表最大顯示寬度,"最大顯示寬度"我們第一反應(yīng)是該字段的值最大能允許存放的值的寬度答渔,以為我們建了int(1)关带,就不能存放數(shù)據(jù)10了, 其實不是這個意思,int(5)和int(10)可存儲的范圍一樣沼撕。
CHAR類型是定長的宋雏,MySQL總是根據(jù)定義的字符串長度分配足夠的空間。當(dāng)保存CHAR值時务豺,在它們的右邊填充空格以達(dá)到指定的長度磨总,當(dāng)檢索到CHAR值時,尾部的空格被刪除掉笼沥。VARCHAR類型用于存儲可變長字符串蚪燕,存儲時,如果字符沒有達(dá)到定義的位數(shù)奔浅,也不會在后面補空格馆纳。char(M) 與 varchar(M)中的的 M 都表示保存的最大字符數(shù),單個字母汹桦、數(shù)字鲁驶、中文等都是占用一個字符。
5.講講索引的作用及結(jié)構(gòu)及使用規(guī)范舞骆。
關(guān)于索引钥弯,能有好多好多問題,可能幾篇文章也寫不明白督禽。簡單分享下這類問題的回答:
索引的目的在于提高查詢效率脆霎。可以類比字典中的目錄狈惫,查找字典內(nèi)容時可以根據(jù)目錄查找到數(shù)據(jù)的存放位置睛蛛,然后直接獲取即可。索引是表的目錄,在查找內(nèi)容之前可以先在目錄中查找索引位置玖院,以此快速定位查詢數(shù)據(jù)菠红。
InnoDB 引擎下,主要使用的是 B+Tree 索引难菌,每個索引其實都是一顆B+樹,B+樹是為了磁盤及其他存儲輔助設(shè)備而設(shè)計的一種平衡查找樹(不是二叉樹)蔑滓,在B+樹中郊酒,所有的數(shù)據(jù)都在葉子節(jié)點,且每一個葉子節(jié)點都帶有指向下一個節(jié)點的指針键袱,形成了一個有序的鏈表燎窘。
從物理存儲角度來看,InnoDB 索引可分為聚簇索引(clustered index)和二級索引(secondary index)或輔助索引蹄咖。聚簇索引的葉子節(jié)點存的是整行數(shù)據(jù)褐健,當(dāng)某條查詢使用的是聚簇索引時,只需要掃描聚簇索引一顆B+樹即可得到所需記錄澜汤,如果想通過二級索引來查找完整的記錄的話蚜迅,需要通過回表操作,也就是在通過二級索引找到主鍵值之后再到聚簇索引中查找完整的記錄俊抵。
索引的優(yōu)點顯而易見是可以加速查詢谁不,但創(chuàng)建索引也是有代價的。首先每建立一個索引都要為它建立一棵B+樹徽诲,會占用額外的存儲空間刹帕;其次當(dāng)對表中的數(shù)據(jù)進行增加、刪除谎替、修改時偷溺,索引也需要動態(tài)的維護,降低了數(shù)據(jù)的維護速度钱贯。所以挫掏,索引的創(chuàng)建及使用時有原則的,一般只為用于搜索喷舀、排序砍濒、分組、連接的列創(chuàng)建索引硫麻,選擇性差的列盡量不創(chuàng)建索引爸邢。
6.講下 MySQL 事務(wù)的特性及隔離級別。
MySQL 事務(wù)相關(guān)問題也經(jīng)常被問到拿愧,一些原理性的東西還是需要深入去學(xué)習(xí)的杠河。
ACID 四個特性:
- A(Atomicity,原子性):一個事務(wù)中的操作要么都成功,要么都失敗券敌。
- C(Consistency唾戚,一致性):數(shù)據(jù)庫總是從一個一致性狀態(tài)轉(zhuǎn)換到另一個一致性狀態(tài),若破壞約束待诅,則不滿足一致性條件叹坦。
- I(Isolation,隔離性):一個事務(wù)的執(zhí)行不能其它事務(wù)干擾卑雁。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其它并發(fā)事務(wù)是隔離的募书,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。
- D(Durability测蹲,持久性):事務(wù)在提交以后莹捡,它所做的修改就會被永久保存到數(shù)據(jù)庫。
事務(wù)隔離級別:
- 讀未提交(Read Uncommitted):事務(wù)中的修改扣甲,即便沒有提交篮赢,對其他事務(wù)也都是可見的。
- 讀已提交(Read Committed):事務(wù)中的修改只有在提交之后琉挖,才會對其他事務(wù)可見启泣。
- 可重復(fù)讀(Repeatable Read):一個事務(wù)中多次查詢相同的記錄,結(jié)果總是一致的(默認(rèn)的隔離級別)粹排。
- 可串行化(Serializable):事務(wù)都是串行執(zhí)行的种远,讀會加讀鎖,寫會加寫鎖顽耳。
并發(fā)事務(wù)帶來的問題:
- 臟讀(Dirty Reads):事務(wù)A讀取了事務(wù)B未提交的數(shù)據(jù)坠敷,然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)射富。
- 不可重復(fù)讀(Non-Repeatable Reads):事務(wù) A 多次讀取同一數(shù)據(jù)膝迎,事務(wù)B在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交胰耗,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時限次,結(jié)果不一致。
- 幻讀(Phantom Reads):幻讀與不可重復(fù)讀類似柴灯。它發(fā)生在一個事務(wù)A讀取了幾行數(shù)據(jù)卖漫,接著另一個并發(fā)事務(wù)B插入了一些數(shù)據(jù)時。在隨后的查詢中赠群,事務(wù)A就會發(fā)現(xiàn)多了一些原本不存在的記錄羊始,就好像發(fā)生了幻覺一樣,所以稱為幻讀查描。
參考: