日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
用了三年MySQL,還不知道Server層和引擎層是如何交互的?

對于很多開發(fā)小伙伴來說,每天寫SQL是必不可少的一項工作。

公司專注于為企業(yè)提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、微信公眾號開發(fā)、商城系統(tǒng)網(wǎng)站開發(fā),微信平臺小程序開發(fā),軟件按需搭建網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計、整合,為客戶設(shè)計出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。

那不知道大家有沒有深入了解過,當(dāng)我們的一條SQL命令被執(zhí)行時,MySQL是如何把數(shù)據(jù)從硬盤/內(nèi)存中查出來并展示到用戶面前的呢?

其實(shí)MySQL也沒有大家想象的那么神秘,當(dāng)我們從整個架構(gòu)的角度去看待,MySQL會分為Server層和引擎層。

Server層主要包含連接器、分析器、優(yōu)化器、執(zhí)行器,還有各種函數(shù)之類的東西等等。

而引擎層就是用來真正處理數(shù)據(jù),比如保存數(shù)據(jù),提供讀寫接口供Server使用。

并且引擎層是可插拔的,就是說我們可以使用各種類型的引擎,比如最常見的InnoDB引擎。

甚至你不想使用官方的引擎,自己開發(fā)一個也是可以的。

那更進(jìn)一步,MySQL是如何查詢一條數(shù)據(jù)的呢?

以上圖為例,是一個簡陋版的普通二級索引B+樹結(jié)構(gòu)。

圖中的每個顏色代表一個數(shù)據(jù)頁,每個數(shù)據(jù)頁中的數(shù)據(jù)會按照從小到大的順序排列,并且會組成一個單向鏈表,即前一條數(shù)據(jù)有一個指向后一條數(shù)據(jù)的指針。不同的數(shù)據(jù)頁之間也會組成一個雙向鏈表。

這樣的好處在于,當(dāng)查詢到第一條數(shù)據(jù)之后,只需要按照順序查下一條數(shù)據(jù),而不用再次從根節(jié)點(diǎn)往下查,大大節(jié)省了查詢效率。

好了,我們回歸正題,下面以一個簡單的例子,看一下Server層和引擎層是如何分工的。

我們知道,MySQL在執(zhí)行一條sql之前,會通過優(yōu)化器生成執(zhí)行計劃,選擇合適的索引。

以下面這條sql為例:

SELECT * FROM system_log 
WHERE create_time BETWEEN '2022-01-01' AND '2022-02-01';

我們按照創(chuàng)建時間查詢?nèi)罩颈淼囊恍┯涗?,并且對?chuàng)建時間字段create_time加上索引,那么執(zhí)行計劃就是這樣的:

從上圖中我們可以看到,MySQL選擇了索引index_createTime,執(zhí)行type是range,表示會按照范圍進(jìn)行查詢。

那么Server層和引擎層是如何分工的呢?

1、Server通過執(zhí)行器調(diào)用InnoDB引擎的查詢接口,InnoDB引擎根據(jù)條件開始定位第一條記錄。/2、由于選擇使用index_createTime索引,那么InnoDB引擎就會去這顆索引樹上,查找符合條件的第一條記錄。

而我們使用的是select *,要查詢?nèi)康臄?shù)據(jù),而普通索引樹上的葉子節(jié)點(diǎn)只保存著索引列和主鍵列,所以需要拿著主鍵id去聚簇索引回表,查詢一條完整的記錄。

查詢到完整記錄之后,InnoDB就會把這條數(shù)據(jù)發(fā)送給Server,Server把這條數(shù)據(jù)返回給客戶端。(隱藏知識點(diǎn):MySQL是邊查邊發(fā)的)

3、InnoDB繼續(xù)查詢下一條數(shù)據(jù),在上文我們說過,數(shù)據(jù)頁中數(shù)據(jù)會組成一個單向鏈表,可以很方便的直接定位到下一條數(shù)據(jù),找到下一條數(shù)據(jù)之后,判斷是否符合條件,如果符合,就繼續(xù)回表查詢完整數(shù)據(jù),然后再把數(shù)據(jù)發(fā)送給Server,Server再把數(shù)據(jù)返回到客戶端。

就這樣,不斷的重復(fù)這個步驟,直到InnoDB匹配到不符合條件的記錄,就停止查詢,告訴Server數(shù)據(jù)已經(jīng)查完了。

Server層和引擎層的交互大致就是這樣的。

總結(jié)一下就是:Server調(diào)用InnoDB引擎接口查詢數(shù)據(jù),引擎把數(shù)據(jù)一條條的查出來并不斷的反饋給Server,Server再將數(shù)據(jù)返回給客戶端。

另外,我們可以在上圖的執(zhí)行計劃中看到extra中出現(xiàn)了Using index condition的字樣,這表示MySQL使用了索引下推的優(yōu)化策略。

有時我們還能發(fā)現(xiàn)extra中會出現(xiàn)Using Where 的提示,這是什么意思呢?

比如我們改一下上面的查詢sql,增加一個request_id='232333'的查詢條件。

SELECT
*
FROM
system_log
WHERE
create_time BETWEEN '2022-01-01'
AND '2022-02-01'
AND request_id = '232333';

再次通過explain查看執(zhí)行計劃:

Using where的意思就是說InnoDB引擎查詢到一條數(shù)據(jù)之后,雖然這條數(shù)據(jù)滿足create_time BETWEEN '2022-01-01' AND '2022-02-01'這個條件,但是還需要Server層再去判斷一下是否符合request_id = '232333'這個條件,兩者都符合的情況下,才會被發(fā)送到客戶端。

大家看到這里應(yīng)該也清楚MySQL的Server是如何與InnoDB引擎交互的了,下次再遇到面試官問這種問題,相信大家就知道該怎么回答了。


網(wǎng)站名稱:用了三年MySQL,還不知道Server層和引擎層是如何交互的?
網(wǎng)站路徑:http://www.5511xx.com/article/cdjsiep.html