大型面試現場:一條update sql執行都經歷什麼?

賜我白日夢發表於2021-02-02

導讀

Hi,大家好!我是白日夢!本文是MySQL專題的第 24 篇。

今天我要跟你分享的MySQL話題是:“從一條update sql執行都經歷什麼開始,發散開一系列的問題,看看你能抗到第幾問吧”

換一種寫作風格,自導自演面試現場!感覺這樣還是比較有趣的,歡迎大家訂閱我的MySQL專題,公眾號首發!持續更新中~

點選閱讀原文,格式會好看一點哦~

點選閱讀原文,格式會好看一點哦~

點選閱讀原文,格式會好看一點哦~

歡迎關注白日夢,公眾號首發!持續連載中


1
好!我們開始吧! 













                              










大型面試現場:一條update sql執行都經歷什麼?

Hi同學,聽說你上一面表現的還可以,這一面要不我們繼續?大型面試現場:一條update sql執行都經歷什麼?


嗯,好啊!大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

好,你說一下一條update sql的執行,都經歷了哪些階段吧大型面試現場:一條update sql執行都經歷什麼?


我可以畫一張簡圖,然後我們一起看一下這張腦圖吧大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

你可以花幾秒看下這個圖哦


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

嗯,你繼續!大型面試現場:一條update sql執行都經歷什麼?


一般在我們的後端系統中,和資料庫打交道都邏輯都放在DAO層,DAO層的持久化框架中封裝了:資料驅動(Driver),SQL語句一般也都是由DAO層的持久化框架傳送給資料庫的。


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

嗯,那你說的DAO層就是上圖中的客戶端了吧大型面試現場:一條update sql執行都經歷什麼?


但是我看你的簡圖,貌似是把資料庫劃分成兩部分,Server層和InnoDB層。你說說看!


是的,通常大家會把資料庫分層兩部分,上層的Server層和下層的儲存引擎層。


總的來看:Server層主要是負責和客戶端建立網路連線,接受客戶端傳遞過來的SQL、預處理、由執行器傳送給儲存引擎執行。

而儲存引擎會和作業系統的檔案系統打交道。


我在圖中畫的儲存引擎層是InnoDB,MySQL不止這一種執行引擎,對於MySQL來說儲存引擎是可插拔的。


常見的還有什麼MyISAM、NDB、Memory等等。


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

嗯,你說的沒錯大型面試現場:一條update sql執行都經歷什麼?!那如果我讓你寫一個MySQL的Server層。大型面試現場:一條update sql執行都經歷什麼?你有什麼思路嗎?說說看!


大型面試現場:一條update sql執行都經歷什麼?.....


大型面試現場:一條update sql執行都經歷什麼?

有思路大型面試現場:一條update sql執行都經歷什麼?,下面我用大白話簡單描述一下:


你知道的!MySQL被吹的再神,本質上不過是個軟體而已大型面試現場:一條update sql執行都經歷什麼?,而且Server層的功能相對來說比較簡單,主要就是接受客戶端的連線,拿到網路包中的SQL語句,然後處理......


並且它是單程式多執行緒的軟體,通常會佔用3306埠啟動,那我完全可以一比一寫出一個MySQL Server層嘛!


比如我可以用熟悉的程式語言,TCP程式設計,寫個TCP - Server端,監聽3306埠啟動。然後從接收到的資料包中取出資料,按照MySQL協議解析資料,得到SQL語句。再處理SQL語句就是了!


大型面試現場:一條update sql執行都經歷什麼?

白日夢補充:歡迎關注我的公眾號,我特希望出一套視訊課從0開始,手擼出一個資料庫中介軟體(有讀寫分離、許可權管理、事務能力)。讓每個加入白日夢的圈子的人都吃透資料庫中介軟體!

大型面試現場:一條update sql執行都經歷什麼?

嗯!(我猜這傢伙肯定對某個資料庫中介軟體特別熟悉大型面試現場:一條update sql執行都經歷什麼?



你整體的思路是沒問題的!



回到正題,繼續說update sql如何被處理。


大型面試現場:一條update sql執行都經歷什麼?,我們的應用程式把SQL傳送給Server層後,SQL會陸續被分析器、優化器、執行器處理。


另外在圖中你能看到:查詢快取。這個查詢快取由Server層維護,它設計的初衷就是在記憶體中暫存原來查詢的結果。以便下次查詢時可以快速得到結果^_^


但是它有個缺點就是當有對該表的更新操作時,該表的查詢快取會被廢棄。所以MySQL8中將查詢快取砍掉了。大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

嗯,繼續。


嗯嗯,那我繼續往下說。


分析器的作用:對SQL進行語法、詞法上的分析。


優化器的作用:生成執行計劃、選擇索引。


執行器的作用:操作執行引擎,獲取SQL的執行結果。


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

嗯,剛才你還說你可以寫個MySQL的Server層,那我現在就讓你實現這個分析器!大型面試現場:一條update sql執行都經歷什麼?


task is cheap,show me the code!


大型面試現場:一條update sql執行都經歷什麼?,可以下看面的Case。


大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?,這個話題過大型面試現場:一條update sql執行都經歷什麼?


你繼續往下說。大型面試現場:一條update sql執行都經歷什麼?


我們的update sql經過server層的分析檢測之後,最終由執行器交由儲存引擎執行。


因為InnoDB是支援事務的,而我們現在是update型別的SQL,所以會被放在一個單獨的事務中去執行。


為了提供事務回滾的能力,於是有了上圖中的第5步,InnoDB儲存引擎會先寫undo log。


大型面試現場:一條update sql執行都經歷什麼?

白日夢補充:
簡介undo log、truncate、以及undo log如何幫你回滾事物?

寫完undo log之後,整體的執行流程會來到圖中的第6步。


在BufferPool快取池中對記憶體中的資料進行update。


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

Buffer Pool快取池?那我得問下


這個Buffer Pool快取池是啥?大型面試現場:一條update sql執行都經歷什麼?


另外我看你上圖中的Server層也有一個查詢快取呀,它和BufferPool快取池啥區別?


嗯,是這樣的。 首先我們都知道,MySQL是支援持久化的,資料最終都落在磁碟上。


但是如果所有的update sql 都直接、大量、頻繁的進行IO磁碟操作,會導致MySQL整體的效能極具下降。


大型面試現場:一條update sql執行都經歷什麼?

現在MySQL實現方式是:它在記憶體中資料進行CRUD,所以在圖中可以看到,BufferPool中的資料是從磁碟上讀進去的。



在記憶體中CRUD就能獲得最大的效能。後續再通過一定的機制將資料重新整理回磁碟中。

大型面試現場:一條update sql執行都經歷什麼?

白日夢補充:
用十一張圖講清楚,當你CRUD時BufferPool中發生了什麼!以及BufferPool的優化!

大型面試現場:一條update sql執行都經歷什麼?

小夥子可以!繼續說!


當update sql修改完記憶體中的資料後,接下來就是提交事務了。提交事務的方式一般都是兩階段提交。


也就是:

1、先寫redo log(prepare)

2、寫binlog

3、寫redo log (commit)


這些日誌後續也都會有一定的機制控制把它們持久化到磁碟中。


大型面試現場:一條update sql執行都經歷什麼?

白日夢補充:
全網最牛X的!MySQL兩階段提交串講!沒有之一!
瞭解bin log的寫入機制嗎?說說你們線上如何調整引數的!
傳說中的MySQL的redo log是什麼?談談看

大型面試現場:一條update sql執行都經歷什麼?

那你說一下redo log、bin log分別給了MySQL什麼能力吧大型面試現場:一條update sql執行都經歷什麼?


記錄binlog可以使MySQL就擁有:搭建叢集、資料備份、資料恢復、審計的能力啊大型面試現場:一條update sql執行都經歷什麼?


寫redolog後MySQL就擁有了崩潰恢復的能力。大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?

大型面試現場:一條update sql執行都經歷什麼?

嗯,那你是怎麼理解這個binlog的資料恢復和redolog的崩潰恢復的呢?大型面試現場:一條update sql執行都經歷什麼?


binlog 有redolog 崩潰恢復的能力嘛?


嗯~,我是這樣理解的:binlog由MySQL的上層也就是Server層記錄。


可以看下這張圖:截自部分binlog


大型面試現場:一條update sql執行都經歷什麼?


可以看到binlog中記錄的是sql語句,記錄這你對哪張表的id=xx的行做了什麼樣的修改。



像資料表啊、行啊這都是一些只存在於輯上概念

大型面試現場:一條update sql執行都經歷什麼?

而redolog中記錄的是物理層面的概念。比如redo log中會記錄你對xxx表空間的XXX資料頁xxx偏移量的地方做了XXX更新。


大型面試現場:一條update sql執行都經歷什麼?

所以說,binlog的資料恢復和redo log的崩潰恢復其實是發生在兩個層面的,完全是兩碼事的!


就像是上圖那樣,binlog的中不是記錄著SQL嗎?所以可以把藉助binlog的實現的資料恢復理解成回放binlog中的SQL。大型面試現場:一條update sql執行都經歷什麼?


而redolog的崩潰恢復指的是當MySQL出現異常Crash重啟後,將記憶體中資料恢復成崩潰前的髒資料大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?

嗯!瞭解大型面試現場:一條update sql執行都經歷什麼?,整體上看你的回答的還可以!


我沒有問題了,你還有什麼想問我的嗎?大型面試現場:一條update sql執行都經歷什麼?


沒有問題了,感謝大佬百忙抽空來給我面試!大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?


大型面試現場:一條update sql執行都經歷什麼?

哈哈,客氣!你應該會進入下一面的。好好準備,期待你下一面優秀的表現大型面試現場:一條update sql執行都經歷什麼?


推薦閱讀

  1. MySQL的修仙之路,圖文談談如何學MySQL、如何進階!(已釋出)
  2. 面前突擊!33道資料庫高頻面試題,你值得擁有!(已釋出)
  3. 大家常說的基數是什麼?(已釋出)
  4. 講講什麼是慢查!如何監控?如何排查?(已釋出)
  5. 對NotNull欄位插入Null值有啥現象?(已釋出)
  6. 能談談 date、datetime、time、timestamp、year的區別嗎?(已釋出)
  7. 瞭解資料庫的查詢快取和BufferPool嗎?談談看!(已釋出)
  8. 你知道資料庫緩衝池中的LRU-List嗎?(已釋出)
  9. 談談資料庫緩衝池中的Free-List?(已釋出)
  10. 談談資料庫緩衝池中的Flush-List?(已釋出)
  11. 瞭解髒頁刷回磁碟的時機嗎?(已釋出)
  12. 用十一張圖講清楚,當你CRUD時BufferPool中發生了什麼!以及BufferPool的優化!(已釋出)
  13. 聽說過表空間沒?什麼是表空間?什麼是資料表?(已釋出)
  14. 談談MySQL的:資料區、資料段、資料頁、資料頁究竟長什麼樣?瞭解資料頁分裂嗎?談談看!(已釋出)
  15. 談談MySQL的行記錄是什麼?長啥樣?(已釋出)
  16. 瞭解MySQL的行溢位機制嗎?(已釋出)
  17. 說說fsync這個系統呼叫吧! (已釋出)
  18. 簡述undo log、truncate、以及undo log如何幫你回滾事物! (已釋出)
  19. 我勸!這位年輕人不講MVCC,耗子尾汁! (已釋出)
  20. MySQL的崩潰恢復到底是怎麼回事? (已釋出)
  21. MySQL的binlog有啥用?誰寫的?在哪裡?怎麼配置 (已釋出)
  22. MySQL的bin log的寫入機制 (已釋出)
  23. 刪庫後!除了跑路還能幹什麼?(已釋出)
  24. 自導自演的面試現場,趣學資料庫的10種檔案(已釋出)

最後,歡迎關注白日夢的公號哦~

換一種寫作風格,自導自演面試現場!感覺這樣還是比較有趣的,歡迎大家訂閱我的MySQL專題,公眾號首發!持續更新中~

點選閱讀原文,格式會好看一點哦~

點選閱讀原文,格式會好看一點哦~

點選閱讀原文,格式會好看一點哦~

相關文章