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