日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

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

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

其實MySQL也沒有大家想象的那么神秘,當我們從整個架構的角度去看待,MySQL會分為Server層和引擎層。

Server層主要包含連接器、分析器、優化器、執行器,還有各種函數之類的東西等等。

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

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

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

那更進一步,MySQL是如何查詢一條數據的呢?

以上圖為例,是一個簡陋版的普通二級索引B+樹結構。

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

這樣的好處在于,當查詢到第一條數據之后,只需要按照順序查下一條數據,而不用再次從根節點往下查,大大節省了查詢效率。

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

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

以下面這條sql為例:

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

我們按照創建時間查詢日志表的一些記錄,并且對創建時間字段create_time加上索引,那么執行計劃就是這樣的:

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

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

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

而我們使用的是select *,要查詢全部的數據,而普通索引樹上的葉子節點只保存著索引列和主鍵列,所以需要拿著主鍵id去聚簇索引回表,查詢一條完整的記錄。

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

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

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

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

總結一下就是:Server調用InnoDB引擎接口查詢數據,引擎把數據一條條的查出來并不斷的反饋給Server,Server再將數據返回給客戶端。

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

有時我們還能發現extra中會出現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查看執行計劃:

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

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

分享到:
標簽:MySQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定