您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關分享幾個常見的MySQL面試題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
這是一道基礎題,考察面試者對數據庫的了解程度,一般可以簡單講下自己的認知,有條理即可。比如:
關系型數據庫是指采用了關系模型來組織數據的數據庫,其以行和列的形式存儲數據。關系型數據庫最大的特點是支持事務。常見的關系型數據庫有 MySQL、Oracle、SQLServer 等。MySQL 是當下最流行的開源數據庫。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,使得很多公司都采用 MySQL 數據庫以降低成本,目前被廣泛地應用在 Internet 上的中小型網站中,尤其適用于 OLTP 領域。
這個問題也經常被問到,和『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 兩個。
這個問題考察面試者對 MySQL 架構的了解,和『一條 select 語句執行流程』問題相似。
MySQL的邏輯架構主要分為3層:
第一層:對客戶端的連接處理、安全認證、授權等,每個客戶端連接都會在服務端擁有一個線程,每個連接發起的查詢都會在對應的單獨線程中執行。
第二層:MySQL的核心服務功能層,包括查詢解析、分析、查詢緩存、內置函數、存儲過程、觸發器、視圖等,select操作會先檢查是否命中查詢緩存,命中則直接返回緩存數據,否則解析查詢并創建對應的解析樹。
第三層:存儲引擎,負責數據的存儲和提取,MySQL服務器通過API與存儲引擎通信,屏蔽了各種引擎之間的差異,常見的存儲引擎有:InnoDB、MyISAM。
一條 select 語句執行流程:
客戶端通過連接器與 MySQL 服務器建立連接,并獲取了用戶的讀寫權限,然后提交查詢語句。
首先 MySQL 會在查詢緩存中對提交的語句進行查詢,如果命中且用戶對表有操作權限,會直接返回查詢緩存中查詢結果作為本次查詢的結果,查詢到此結束。
如果查詢緩存未命中,會來到分析器,分析器會解析語句并檢查其合法性。如果語句不符合 MySQL 的語法規范,執行器會報錯,查詢到此結束。
若語句合法,會來到優化器,優化器會為 SQL 語句選擇最優的執行計劃。
最后來到執行器,如果用戶對表有操作權限,執行器會調用存儲引擎提供的接口來執行 SQL 語句,然后將查詢結果返回給客戶端,查詢到此結束。
這個問題考察面試者對 MySQL 字段類型的了解程度,可以延伸出很多小問題,例如 char 與 varchar 的區別。
常用的字段類型分類:
數值型:
字符串類型:
日期和時間類型:
int(M)中的 M 代表最大顯示寬度,"最大顯示寬度"我們第一反應是該字段的值最大能允許存放的值的寬度,以為我們建了int(1),就不能存放數據10了, 其實不是這個意思,int(5)和int(10)可存儲的范圍一樣。
CHAR類型是定長的,MySQL總是根據定義的字符串長度分配足夠的空間。當保存CHAR值時,在它們的右邊填充空格以達到指定的長度,當檢索到CHAR值時,尾部的空格被刪除掉。VARCHAR類型用于存儲可變長字符串,存儲時,如果字符沒有達到定義的位數,也不會在后面補空格。char(M) 與 varchar(M)中的的 M 都表示保存的最大字符數,單個字母、數字、中文等都是占用一個字符。
關于索引,能有好多好多問題,可能幾篇文章也寫不明白。簡單分享下這類問題的回答:
索引的目的在于提高查詢效率。可以類比字典中的目錄,查找字典內容時可以根據目錄查找到數據的存放位置,然后直接獲取即可。索引是表的目錄,在查找內容之前可以先在目錄中查找索引位置,以此快速定位查詢數據。
InnoDB 引擎下,主要使用的是 B+Tree 索引,每個索引其實都是一顆B+樹,B+樹是為了磁盤及其他存儲輔助設備而設計的一種平衡查找樹(不是二叉樹),在B+樹中,所有的數據都在葉子節點,且每一個葉子節點都帶有指向下一個節點的指針,形成了一個有序的鏈表。
從物理存儲角度來看,InnoDB 索引可分為聚簇索引(clustered index)和二級索引(secondary index)或輔助索引。聚簇索引的葉子節點存的是整行數據,當某條查詢使用的是聚簇索引時,只需要掃描聚簇索引一顆B+樹即可得到所需記錄,如果想通過二級索引來查找完整的記錄的話,需要通過回表操作,也就是在通過二級索引找到主鍵值之后再到聚簇索引中查找完整的記錄。
索引的優點顯而易見是可以加速查詢,但創建索引也是有代價的。首先每建立一個索引都要為它建立一棵B+樹,會占用額外的存儲空間;其次當對表中的數據進行增加、刪除、修改時,索引也需要動態的維護,降低了數據的維護速度。所以,索引的創建及使用時有原則的,一般只為用于搜索、排序、分組、連接的列創建索引,選擇性差的列盡量不創建索引。
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面試題有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。