本篇文章給大家?guī)?lái)了關(guān)于mysql的相關(guān)知識(shí),其中主要介紹了關(guān)于數(shù)據(jù)庫(kù)廠家面試題的一些總結(jié),下面一起來(lái)看一下,希望對(duì)大家有幫助。

推薦學(xué)習(xí):mysql視頻教程
1、數(shù)據(jù)庫(kù)的常用范式:
- 第一范式(1NF):指表的列不可再分,數(shù)據(jù)庫(kù)中表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值;
- 第二范式(2NF):在 1NF 的基礎(chǔ)上,還包含兩部分的內(nèi)容:一是表必須有一個(gè)主鍵;二是表中非主鍵列必須完全依賴于主鍵,不能只依賴于主鍵的一部分;
- 第三范式(3NF):在 2NF 的基礎(chǔ)上,消除非主鍵列對(duì)主鍵的傳遞依賴,非主鍵列必須直接依賴于主鍵。
- BC范式(BCNF):在 3NF 的基礎(chǔ)上,消除主屬性對(duì)于碼部分的傳遞依賴
2、SQL語(yǔ)句的執(zhí)行過(guò)程:
2.1、客戶端的數(shù)據(jù)庫(kù)驅(qū)動(dòng)與數(shù)據(jù)庫(kù)連接池:
(1)客戶端與數(shù)據(jù)庫(kù)進(jìn)行通信前,通過(guò)數(shù)據(jù)庫(kù)驅(qū)動(dòng)與MySQL建立連接,建立完成之后,就發(fā)送SQL語(yǔ)句
(2)為了減少頻繁創(chuàng)建和銷(xiāo)毀連接造成系統(tǒng)性能的下降,通過(guò)數(shù)據(jù)庫(kù)連接池維護(hù)一定數(shù)量的連接線程,當(dāng)需要進(jìn)行連接時(shí),就直接從連接池中獲取,使用完畢之后,再歸還給連接池。常見(jiàn)的數(shù)據(jù)庫(kù)連接池有 Druid、C3P0、DBCP
2.2、MySQL架構(gòu)的Server層的執(zhí)行過(guò)程:
(1)連接器:主要負(fù)責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接
(2)查詢緩存:優(yōu)先在緩存中進(jìn)行查詢,如果查到了則直接返回,如果緩存中查詢不到,在去數(shù)據(jù)庫(kù)中查詢。
MySQL緩存是默認(rèn)關(guān)閉的,也就是說(shuō)不推薦使用緩存,并且在MySQL8.0 版本已經(jīng)將查詢緩存的整塊功能刪掉了。這主要是它的使用場(chǎng)景限制造成的:
- 先說(shuō)下緩存中數(shù)據(jù)存儲(chǔ)格式:key(sql語(yǔ)句)- value(數(shù)據(jù)值),所以如果SQL語(yǔ)句(key)只要存在一點(diǎn)不同之處就會(huì)直接進(jìn)行數(shù)據(jù)庫(kù)查詢了;
- 由于表中的數(shù)據(jù)不是一成不變的,大多數(shù)是經(jīng)常變化的,而當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)變化了,那么相應(yīng)的與此表相關(guān)的緩存數(shù)據(jù)就需要移除掉;
(3)解析器/分析器:分析器的工作主要是對(duì)要執(zhí)行的SQL語(yǔ)句進(jìn)行詞法解析、語(yǔ)法解析,最終得到抽象語(yǔ)法樹(shù),然后再使用預(yù)處理器對(duì)抽象語(yǔ)法樹(shù)進(jìn)行語(yǔ)義校驗(yàn),判斷抽象語(yǔ)法樹(shù)中的表是否存在,如果存在的話,在接著判斷select投影列字段是否在表中存在等。
(4)優(yōu)化器:主要將SQL經(jīng)過(guò)詞法解析、語(yǔ)法解析后得到的語(yǔ)法樹(shù),通過(guò)數(shù)據(jù)字典和統(tǒng)計(jì)信息的內(nèi)容,再經(jīng)過(guò)一系列運(yùn)算 ,最終得出一個(gè)執(zhí)行計(jì)劃,包括選擇使用哪個(gè)索引
在分析是否走索引查詢時(shí),是通過(guò)進(jìn)行動(dòng)態(tài)數(shù)據(jù)采樣統(tǒng)計(jì)分析出來(lái);只要是統(tǒng)計(jì)分析出來(lái)的,那就可能會(huì)存在分析錯(cuò)誤的情況,所以在SQL執(zhí)行不走索引時(shí),也要考慮到這方面的因素
(5)執(zhí)行器:根據(jù)一系列的執(zhí)行計(jì)劃去調(diào)用存儲(chǔ)引擎提供的API接口去調(diào)用操作數(shù)據(jù),完成SQL的執(zhí)行。
2.3、Innodb存儲(chǔ)引擎的執(zhí)行過(guò)程:
- (1)首先MySQL執(zhí)行器根據(jù) 執(zhí)行計(jì)劃 調(diào)用存儲(chǔ)引擎的API查詢數(shù)據(jù)
- (2)存儲(chǔ)引擎先從緩存池buffer pool中查詢數(shù)據(jù),如果沒(méi)有就會(huì)去磁盤(pán)中查詢,如果查詢到了就將其放到緩存池中
- (3)在數(shù)據(jù)加載到 Buffer Pool 的同時(shí),會(huì)將這條數(shù)據(jù)的原始記錄保存到 undo 日志文件中
- (4)innodb 會(huì)在 Buffer Pool 中執(zhí)行更新操作
- (5)更新后的數(shù)據(jù)會(huì)記錄在 redo log buffer 中
- (6)提交事務(wù)在提交的同時(shí)會(huì)做以下三件事
- (7)(第一件事)將redo log buffer中的數(shù)據(jù)刷入到redo log文件中
- (8)(第二件事)將本次操作記錄寫(xiě)入到 bin log文件中
- (9)(第三件事)將bin log文件名字和更新內(nèi)容在 bin log 中的位置記錄到redo log中,同時(shí)在 redo log 最后添加 commit 標(biāo)記
- (10)使用一個(gè)后臺(tái)線程,它會(huì)在某個(gè)時(shí)機(jī)將我們Buffer Pool中的更新后的數(shù)據(jù)刷到 MySQL 數(shù)據(jù)庫(kù)中,這樣就將內(nèi)存和數(shù)據(jù)庫(kù)的數(shù)據(jù)保持統(tǒng)一了
3、常用的存儲(chǔ)引擎?InnoDB與MyISAM的區(qū)別?
存儲(chǔ)引擎是對(duì)底層物理數(shù)據(jù)執(zhí)行實(shí)際操作的組件,為Server服務(wù)層提供各種操作數(shù)據(jù)的API。常用的存儲(chǔ)引擎有InnoDB、MyISAM、Memory。這里我們主要介紹InnoDB 與 MyISAM 的區(qū)別:
(1)事務(wù):MyISAM不支持事務(wù),InnoDB支持事務(wù)
(2)鎖級(jí)別:MyISAM只支持表級(jí)鎖,InnoDB支持行級(jí)鎖和表級(jí)鎖,默認(rèn)使用行級(jí)鎖,但是行鎖只有通過(guò)索引查詢數(shù)據(jù)才會(huì)使用,否則將使用表鎖。行級(jí)鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖
站長(zhǎng)資訊網(wǎng)