我當(dāng)面試官,面你 MySQL 基礎(chǔ)
時間:2021-10-11 13:59:39
手機(jī)看文章
掃描二維碼
隨時隨地手機(jī)看文章
[導(dǎo)讀]許久不見的【面試官來襲】系列終于又和大家見面啦!很多人問我,面試到底考察什么?面試官究竟想聽到怎樣的回答?針對這類疑惑,我覺得最好的解答,無疑是帶著大家,以面試官視角,去進(jìn)行面試,知己知彼,百戰(zhàn)不殆,這就是這個系列的初衷。針對MySQL,一般要考察的知識點都在下圖,根據(jù)候選人的情...
許久不見的【面試官來襲】系列終于又和大家見面啦!
很多人問我,面試到底考察什么?面試官究竟想聽到怎樣的回答?針對這類疑惑,我覺得最好的解答,無疑是帶著大家,以面試官視角,去進(jìn)行面試,知己知彼,百戰(zhàn)不殆,這就是這個系列的初衷。
針對MySQL,一般要考察的知識點都在下圖,根據(jù)候選人的情況,會選擇不同的知識點進(jìn)行提問。
通過上圖,大家對MySQL面試問題也心里有數(shù)了吧?
由于有小伙伴反應(yīng)第一彈Redis系列內(nèi)容過長,消化不過來。所以我從本次開始,每個技術(shù)專題,都會由淺至深,分篇進(jìn)行講解,知識點也會更加全面。
話不多說,接下來就來看看我們面試官系列的第二彈——MySQL基礎(chǔ)篇。
今天的面試者依舊是阿柴,經(jīng)過上次Redis的洗禮,面對惡魔面試官,相信阿柴也更游刃有余了。
現(xiàn)在,就讓我們開啟這場沉浸式面試吧。
基本概念
你能談?wù)凪ySQL是什么嗎?MySQL是一個傳統(tǒng)的RDBM數(shù)據(jù)庫,也就是關(guān)系型數(shù)據(jù)庫,廣泛應(yīng)用于OLTP場景。
你提到了OLTP,能說說它和OLAP的區(qū)別是什么嗎?OLTP(聯(lián)機(jī)事務(wù)處理)是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的主要應(yīng)用,用于基本的、日常的事務(wù)處理,例如銀行的交易記錄;
而OLAP(聯(lián)機(jī)分析處理)是數(shù)據(jù)倉庫系統(tǒng)的主要應(yīng)用,支持復(fù)雜的分析操作,側(cè)重決策支持,并且提供了直觀易懂的查詢結(jié)果。最常見的應(yīng)用就是復(fù)雜的動態(tài)報表系統(tǒng)。
總體來說,OLTP用于日常處理、OLAP用于數(shù)據(jù)分析。
你知道數(shù)據(jù)庫的三范式分別是什么嗎?第一范式:字段不可分。強(qiáng)調(diào)的是列的原子性,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項;
第二范式:有主鍵,非主鍵字段依賴主鍵。要求實體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性;
第三范式:非主鍵字段不能相互依賴,任何非主屬性不依賴于其它非主屬性。
基礎(chǔ)定義類的問題一般問校招生比較多,考察一下理論知識。在實際應(yīng)用中,只是個參考,某些場景,甚至可以反范式。
DML是什么呢?DML是數(shù)據(jù)操作語言,用于檢索或者修改數(shù)據(jù)。我們平常最常用的增刪查改就是DML。
DDL又是什么?DDL是數(shù)據(jù)定義語言,用于操作數(shù)據(jù)結(jié)構(gòu),比如創(chuàng)建表,刪除表,更改索引等都是DDL。
那DCL呢?DCL是數(shù)據(jù)控制語言,用于定義數(shù)據(jù)庫用戶的權(quán)限,比如創(chuàng)建用戶,授權(quán)用戶,刪除用戶等都是DCL。
以上三個問題,是針對數(shù)據(jù)庫操作分類的考察。很多同學(xué)只知道增刪查改,并不知道它們屬于哪類。
這些抽象概念都是重要的數(shù)據(jù)庫基礎(chǔ)知識,由于學(xué)生大多缺乏經(jīng)驗,面試官不會偏向于實戰(zhàn)型或技術(shù)型的問題,所以這類概念型知識點往往是校招考察的重點方向。
數(shù)據(jù)結(jié)構(gòu)與常見操作
能說說varchar與char的區(qū)別是什么嗎?char是一種固定長度的類型,varchar則是一種可變長度的類型。比如char(128)和varchar(128),前者無論字符串長短,在磁盤上,都會占據(jù)固定的128字符大小。后者是可變長度,不過它最大也不能超過128。
既然varchar是變長,那是不是設(shè)置varchar(1000)一定比varchar(100)好?
嗯...不是這樣的。雖然varchar是變長,在相同長度下,磁盤空間占用一樣,將值設(shè)置更大一些,彈性空間也更大。但也不是完全沒有代價的...
在內(nèi)存加載的時候,每次都是按最大空間來分配的。顯然,在排序場景,或者一些臨時表聚合場景,更大空間會產(chǎn)生明顯的不利影響。
varchar中的長度不光影響磁盤空間,還會影響在使用時的內(nèi)存空間,并不是越長越好,這也是個常見且易踩坑的考點。
varchar是變長,char是定長,那能用varchar完全代替char么?不能。varchar的優(yōu)點是更靈活。但是char也不是一無是處的。首先,varchar會額外用一個字節(jié)存儲長度信息,而char則節(jié)約了一個字節(jié);
其次,char的存儲空間都是一次性分配的,存儲是固定連續(xù)的,而varchar的存儲的長度是可變的,當(dāng)varchar更改前后數(shù)據(jù)長度不一致時,就不可避免的會出現(xiàn)碎片的問題。針對此,需要進(jìn)行碎片消除作業(yè),也是額外的成本。
一般來說,長度固定的字段,還是用char比較合適,比如Hash,就很適合用char。
varchar(11)和int(11)中的50,有什么區(qū)別?varcahr中代表能存11個字符,int中只是代表顯示長度,對大多數(shù)應(yīng)用沒有意義,只是規(guī)定一些工具用來顯示字符的個數(shù),比如int(1)和int(20)存儲和計算其實是一樣的。
int(11)的11代表什么,這是個初學(xué)者很容易混淆的問題,其實它只是用于顯示長度,不會影響存儲空間。如果這個問題答錯,會給面試官留下基礎(chǔ)不扎實的印象。
接下來能說說delete和truncate的區(qū)別嗎?delete是刪除行;truncate是整表刪除。具體來說,有下面幾點區(qū)別:
1.truncate之后,會釋放空間;delete之后,不會釋放空間,因為delete只是在行上標(biāo)記刪除,后續(xù)可以復(fù)用;
2.delete因為是DML,會產(chǎn)生redo log;truncate是DDL則不會;
3.truncate效率更高;4.truncate之后,id從頭開始;delete不會。
MySQL特性考察
你知道MySQL有哪些存儲引擎嗎?首先有Innodb引擎,它提供了對數(shù)據(jù)庫ACID事務(wù)的支持,并且還提供了行級鎖和外鍵的約束。Innodb的設(shè)計目標(biāo)就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫系統(tǒng);
還有MyIASM引擎,它是原本Mysql的默認(rèn)引擎,不提供事務(wù)的支持,也不支持行級鎖和外鍵;
最后還有一個MEMORY引擎,它的所有數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)的處理速度快,但是安全性不高,很少使用。
那么ACID是什么呢?它是原子性、一致性、隔離性和持久性的縮寫。
原子性,指的是一個事務(wù)只有執(zhí)行成功和失敗回滾兩種狀態(tài),沒有中間態(tài);一致性是說數(shù)據(jù)狀態(tài)一定是一致的;隔離性是說事務(wù)之間互不影響;持久性是指事務(wù)執(zhí)行完成后,對數(shù)據(jù)所做的操作持久的保存在數(shù)據(jù)庫中。
從一定程序上來講,數(shù)據(jù)庫通過原子性、隔離性、持久性來保證一致性。也就是說ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔離性)、D(持久性)是手段。
主鍵和外鍵分別是什么?主鍵是表中的一個或多個字段,它的值用于唯一的標(biāo)識表中的某一條記錄。
外鍵是說某張表b的主鍵,在另一張表a中被使用,那么a中該字段可以使用的范圍,取決于b。外鍵約束主要用來維護(hù)兩個表之間數(shù)據(jù)的一致性。
那么一張表一定有主鍵嗎?是的。一定有。如果主動設(shè)置,則采用設(shè)置的。否則會自動生成一個默認(rèn)的行。
你怎么查看有多少個Sql語句在執(zhí)行?
可以用show processlist,它是顯示用戶正在運行的線程的命令。需要注意的是,用戶都只能看到自己正在運行的線程,除非是root用戶,或者專門進(jìn)行了授權(quán)的用戶。
MySQL是后臺開發(fā)中非常重要的領(lǐng)域,更是面試環(huán)節(jié)的高頻考點,十次面試有十一次都會被問到!
針對MySQl的問法各有不同,但基礎(chǔ)知識是繞不過的,這些重點問題,如果在面試中遇到,要能找到聯(lián)系并往上靠。