主頁 > 知識(shí)庫 > 幾個(gè)MySQL高頻面試題的解答

幾個(gè)MySQL高頻面試題的解答

熱門標(biāo)簽:北京人工外呼系統(tǒng)價(jià)錢 地圖標(biāo)注被騙三百怎么辦 福州呼叫中心外呼系統(tǒng)哪家好 房產(chǎn)智能外呼系統(tǒng)品牌 天智外呼系統(tǒng) 常州電銷外呼系統(tǒng)一般多少錢 400電話鄭州申請(qǐng) 云南語音外呼系統(tǒng)平臺(tái) 沃克斯電梯外呼線路圖

前言: 

在各類技術(shù)崗位面試中,似乎 MySQL 相關(guān)問題經(jīng)常被問到。無論你面試開發(fā)崗位或運(yùn)維崗位,總會(huì)問幾道數(shù)據(jù)庫問題。經(jīng)常有小伙伴私信我,詢問如何應(yīng)對(duì) MySQL 面試題。其實(shí)很多面試題都是大同小異的,提前做準(zhǔn)備還是很有必要的。本篇文章簡單說下幾個(gè)常見的面試題,一起來學(xué)習(xí)下吧。

1.什么是關(guān)系型數(shù)據(jù)庫?談?wù)勀銓?duì) MySQL 的認(rèn)識(shí)。

這是一道基礎(chǔ)題,考察面試者對(duì)數(shù)據(jù)庫的了解程度,一般可以簡單講下自己的認(rèn)知,有條理即可。比如:

關(guān)系型數(shù)據(jù)庫是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫,其以行和列的形式存儲(chǔ)數(shù)據(jù)。關(guān)系型數(shù)據(jù)庫最大的特點(diǎn)是支持事務(wù)。常見的關(guān)系型數(shù)據(jù)庫有 MySQL、Oracle、SQLServer 等。MySQL 是當(dāng)下最流行的開源數(shù)據(jù)庫。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),使得很多公司都采用 MySQL 數(shù)據(jù)庫以降低成本,目前被廣泛地應(yīng)用在 Internet 上的中小型網(wǎng)站中,尤其適用于 OLTP 領(lǐng)域。

2.MySQL 常見的存儲(chǔ)引擎有哪些,有什么區(qū)別?

這個(gè)問題也經(jīng)常被問到,和『InnoDB 與 MyISAM 引擎的區(qū)別』問題相似。

常見的幾種存儲(chǔ)引擎:

  • InnoDB: MySQL 默認(rèn)的存儲(chǔ)引擎,支持事務(wù)、MVCC、外鍵、行級(jí)鎖和自增列。
  • MyISAM: 支持全文索引、壓縮、空間函數(shù)、表級(jí)鎖,不支持事務(wù),插入速度快。
  • Memory: 數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)的處理速度快,但是安全性不高。
  • ARCHIVE: 常用于歷史歸檔表,占用空間小,數(shù)據(jù)不能更新刪除。

InnoDB 與 MyISAM 引擎的幾點(diǎn)區(qū)別:

  • InnoDB 支持事務(wù),MyISAM 不支持事務(wù)。
  • InnoDB 支持外鍵,而 MyISAM 不支持。
  • InnoDB 不支持全文索引,而 MyISAM 支持。
  • InnoDB 是聚簇索引,MyISAM 是非聚簇索引。
  • InnoDB 不保存表的具體行數(shù),而 MyISAM 用一個(gè)變量保存了整個(gè)表的行數(shù)。
  • InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。
  • 存儲(chǔ)結(jié)構(gòu)不同,MyISAM 表分為 frm MYD MYI 三個(gè),InnoDB 一般分為 frm ibd 兩個(gè)。

3.描述下 MySQL 基礎(chǔ)架構(gòu)。

這個(gè)問題考察面試者對(duì) MySQL 架構(gòu)的了解,和『一條 select 語句執(zhí)行流程』問題相似。

MySQL的邏輯架構(gòu)主要分為3層:

  • 第一層:對(duì)客戶端的連接處理、安全認(rèn)證、授權(quán)等,每個(gè)客戶端連接都會(huì)在服務(wù)端擁有一個(gè)線程,每個(gè)連接發(fā)起的查詢都會(huì)在對(duì)應(yīng)的單獨(dú)線程中執(zhí)行。
  • 第二層:MySQL的核心服務(wù)功能層,包括查詢解析、分析、查詢緩存、內(nèi)置函數(shù)、存儲(chǔ)過程、觸發(fā)器、視圖等,select操作會(huì)先檢查是否命中查詢緩存,命中則直接返回緩存數(shù)據(jù),否則解析查詢并創(chuàng)建對(duì)應(yīng)的解析樹。
  • 第三層:存儲(chǔ)引擎,負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提取,MySQL服務(wù)器通過API與存儲(chǔ)引擎通信,屏蔽了各種引擎之間的差異,常見的存儲(chǔ)引擎有:InnoDB、MyISAM。

一條 select 語句執(zhí)行流程:

  • 客戶端通過連接器與 MySQL 服務(wù)器建立連接,并獲取了用戶的讀寫權(quán)限,然后提交查詢語句。
  • 首先 MySQL 會(huì)在查詢緩存中對(duì)提交的語句進(jìn)行查詢,如果命中且用戶對(duì)表有操作權(quán)限,會(huì)直接返回查詢緩存中查詢結(jié)果作為本次查詢的結(jié)果,查詢到此結(jié)束。
  • 如果查詢緩存未命中,會(huì)來到分析器,分析器會(huì)解析語句并檢查其合法性。如果語句不符合 MySQL 的語法規(guī)范,執(zhí)行器會(huì)報(bào)錯(cuò),查詢到此結(jié)束。
  • 若語句合法,會(huì)來到優(yōu)化器,優(yōu)化器會(huì)為 SQL 語句選擇最優(yōu)的執(zhí)行計(jì)劃。
  • 最后來到執(zhí)行器,如果用戶對(duì)表有操作權(quán)限,執(zhí)行器會(huì)調(diào)用存儲(chǔ)引擎提供的接口來執(zhí)行 SQL 語句,然后將查詢結(jié)果返回給客戶端,查詢到此結(jié)束。

4.說說常用的幾種字段類型。

這個(gè)問題考察面試者對(duì) MySQL 字段類型的了解程度,可以延伸出很多小問題,例如 char 與 varchar 的區(qū)別。

常用的字段類型分類:

數(shù)值型:

字符串類型:

日期和時(shí)間類型:

int(M)中的 M 代表最大顯示寬度,"最大顯示寬度"我們第一反應(yīng)是該字段的值最大能允許存放的值的寬度,以為我們建了int(1),就不能存放數(shù)據(jù)10了, 其實(shí)不是這個(gè)意思,int(5)和int(10)可存儲(chǔ)的范圍一樣。

CHAR類型是定長的,MySQL總是根據(jù)定義的字符串長度分配足夠的空間。當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長度,當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉。VARCHAR類型用于存儲(chǔ)可變長字符串,存儲(chǔ)時(shí),如果字符沒有達(dá)到定義的位數(shù),也不會(huì)在后面補(bǔ)空格。char(M) 與 varchar(M)中的的 M 都表示保存的最大字符數(shù),單個(gè)字母、數(shù)字、中文等都是占用一個(gè)字符。

5.講講索引的作用及結(jié)構(gòu)及使用規(guī)范。

關(guān)于索引,能有好多好多問題,可能幾篇文章也寫不明白。簡單分享下這類問題的回答:

索引的目的在于提高查詢效率??梢灶惐茸值渲械哪夸?,查找字典內(nèi)容時(shí)可以根據(jù)目錄查找到數(shù)據(jù)的存放位置,然后直接獲取即可。索引是表的目錄,在查找內(nèi)容之前可以先在目錄中查找索引位置,以此快速定位查詢數(shù)據(jù)。

InnoDB 引擎下,主要使用的是 B+Tree 索引,每個(gè)索引其實(shí)都是一顆B+樹,B+樹是為了磁盤及其他存儲(chǔ)輔助設(shè)備而設(shè)計(jì)的一種平衡查找樹(不是二叉樹),在B+樹中,所有的數(shù)據(jù)都在葉子節(jié)點(diǎn),且每一個(gè)葉子節(jié)點(diǎn)都帶有指向下一個(gè)節(jié)點(diǎn)的指針,形成了一個(gè)有序的鏈表。

從物理存儲(chǔ)角度來看,InnoDB 索引可分為聚簇索引(clustered index)和二級(jí)索引(secondary index)或輔助索引。聚簇索引的葉子節(jié)點(diǎn)存的是整行數(shù)據(jù),當(dāng)某條查詢使用的是聚簇索引時(shí),只需要掃描聚簇索引一顆B+樹即可得到所需記錄,如果想通過二級(jí)索引來查找完整的記錄的話,需要通過回表操作,也就是在通過二級(jí)索引找到主鍵值之后再到聚簇索引中查找完整的記錄。

索引的優(yōu)點(diǎn)顯而易見是可以加速查詢,但創(chuàng)建索引也是有代價(jià)的。首先每建立一個(gè)索引都要為它建立一棵B+樹,會(huì)占用額外的存儲(chǔ)空間;其次當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除、修改時(shí),索引也需要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度。所以,索引的創(chuàng)建及使用時(shí)有原則的,一般只為用于搜索、排序、分組、連接的列創(chuàng)建索引,選擇性差的列盡量不創(chuàng)建索引。

6.講下 MySQL 事務(wù)的特性及隔離級(jí)別。

MySQL 事務(wù)相關(guān)問題也經(jīng)常被問到,一些原理性的東西還是需要深入去學(xué)習(xí)的。

ACID 四個(gè)特性:

  • A(Atomicity,原子性):一個(gè)事務(wù)中的操作要么都成功,要么都失敗。
  • C(Consistency,一致性):數(shù)據(jù)庫總是從一個(gè)一致性狀態(tài)轉(zhuǎn)換到另一個(gè)一致性狀態(tài),若破壞約束,則不滿足一致性條件。
  • I(Isolation,隔離性):一個(gè)事務(wù)的執(zhí)行不能其它事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其它并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
  • D(Durability,持久性):事務(wù)在提交以后,它所做的修改就會(huì)被永久保存到數(shù)據(jù)庫。

事務(wù)隔離級(jí)別:

  • 讀未提交(Read Uncommitted):事務(wù)中的修改,即便沒有提交,對(duì)其他事務(wù)也都是可見的。
  • 讀已提交(Read Committed):事務(wù)中的修改只有在提交之后,才會(huì)對(duì)其他事務(wù)可見。
  • 可重復(fù)讀(Repeatable Read):一個(gè)事務(wù)中多次查詢相同的記錄,結(jié)果總是一致的(默認(rèn)的隔離級(jí)別)。
  • 可串行化(Serializable):事務(wù)都是串行執(zhí)行的,讀會(huì)加讀鎖,寫會(huì)加寫鎖。

并發(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多次讀取的過程中,對(duì)數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果不一致。
  • 幻讀(Phantom Reads):幻讀與不可重復(fù)讀類似。它發(fā)生在一個(gè)事務(wù)A讀取了幾行數(shù)據(jù),接著另一個(gè)并發(fā)事務(wù)B插入了一些數(shù)據(jù)時(shí)。在隨后的查詢中,事務(wù)A就會(huì)發(fā)現(xiàn)多了一些原本不存在的記錄,就好像發(fā)生了幻覺一樣,所以稱為幻讀。

以上就是幾個(gè)MySQL高頻面試題的解答的詳細(xì)內(nèi)容,更多關(guān)于MySQL高頻面試題的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Mysql數(shù)據(jù)庫索引面試題(程序員基礎(chǔ)技能)
  • 2019最新21個(gè)MySQL高頻面試題介紹
  • 分享幾道關(guān)于MySQL索引的重點(diǎn)面試題
  • 三道MySQL新手入門面試題,通往自由的道路

標(biāo)簽:沈陽 拉薩 鹽城 沈陽 移動(dòng) 徐州 黔東 珠海

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《幾個(gè)MySQL高頻面試題的解答》,本文關(guān)鍵詞  幾個(gè),MySQL,高頻,面試,題的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《幾個(gè)MySQL高頻面試題的解答》相關(guān)的同類信息!
  • 本頁收集關(guān)于幾個(gè)MySQL高頻面試題的解答的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章