幾個MySQL高頻面試題的解答

前言: 

在各類技術崗位面試中,似乎 MySQL 相關問題經常被問到。無論你面試開發崗位或運維崗位,總會問幾道數據庫問題。經常有小夥伴私信我,詢問如何應對 MySQL 面試題。其實很多面試題都是大同小異的,提前做準備還是很有必要的。本篇文章簡單說下幾個常見的面試題,一起來學習下吧。

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就會發現多瞭一些原本不存在的記錄,就好像發生瞭幻覺一樣,所以稱為幻讀。

以上就是幾個MySQL高頻面試題的解答的詳細內容,更多關於MySQL高頻面試題的資料請關註WalkonNet其它相關文章!

推薦閱讀: