MySQL 核心模塊揭祕 |《發刊詞》

1. 爲什麼要寫專欄?

我還在做業務系統研發的時候,有一段時間,系統不穩定,慢 SQL 很多。我們團隊花了很長時間持續優化 SQL。

我們有一個表格,從慢查詢日誌裏整理出了很多慢 SQL。其中一些 SQL,按照我們的理解,根本不應該出現在表格裏,但是它們卻經常出現。

我對這些 SQL 印象深刻,它們是:

  • update xxx set xxx where id = xxx
  • commit
  • truncate table xxx

以我們當時對 MySQL 有限的瞭解,這些 SQL 執行起來都很快,不應該出現在慢查詢日誌裏。

我們不瞭解這些 SQL 執行過程中都幹了些什麼,不理解它們是怎麼執行的,想要優化也就無處下手了。

隨着逐漸深入研究 MySQL 源碼,我已經能解釋這些 SQL 爲什麼會出現在慢查詢日誌裏了。

對 SQL 執行過程不瞭解,這是我曾經的痛點,相信也是很多業務系統研發和 DBA 的痛點。

我投入了很多時間研究 MySQL 源碼,正在逐步解決這些痛點。

現在,我把這些內容寫出來,分享給需要的各位讀者,希望也能幫助大家解決工作過程中遇到的痛點。

2. 專欄包含哪些內容?

我正在研究 InnoDB 的幾個模塊,專欄內容都來源於這些模塊:

  • 事務
  • 鎖(InnoDB 的記錄鎖和表鎖,不包含 server 層的元數據鎖)
  • Redo
  • Undo
  • MVCC

3. 專欄內容怎麼呈現?

關於專欄的內容,我考慮過 3 種呈現方式。

① 源碼詳細分析。<br />以講解源碼爲主,在講解源碼的過程中,順便介紹原理。

之前寫過幾篇 MySQL 功能實現的源碼分析文章、也結合源碼寫了幾篇分析線上問題的文章,有讀者反饋看不懂源碼,對於這樣的文章,他們會直接跳過源碼,只看原理介紹。

② 源碼關鍵節點 + 原理介紹:<br />用 SQL 執行過程中經歷的關鍵節點的源碼把原理串起來。

這種方式按照 SQL 的執行流程,通過源碼關鍵節點來介紹原理,文章內容可能會有點碎片化,不好抽象成介紹原理且邏輯流暢的文章。

③ 原理介紹:<br />這種方式以講解原理爲主,在需要的時候會加上一點點源碼作爲輔助,方便理解。我之前寫的公衆號文章主要以這種方式呈現。

考慮到目標讀者是想了解 MySQL 底層原理的業務系統研發和 DBA,最終還是確定以第 ③ 種方式(原理介紹)來寫專欄的系列文章。

4. 聊聊心路歷程

這個專欄從虛無中誕生,算是個結果。凡事有果必有因,我們再來聊聊是什麼因結出了這個果。

細算起來,我已經 4 個月沒寫文章了,停更這麼久,並不是放棄了寫文章,而是把重點轉移到研究 MySQL 源碼上了。

這段暫停時期,既是意料之外,也是順理成章。

意料之外在於,我也沒有想到 8 月份寫完《InnoDB 全表掃描和全主鍵掃描一樣嗎?》這篇文章之後,就會停更,並且一停就是 4 個月。

順理成章在於,8 月份之前已經有一段時間感覺到寫文章喫力了,停更也是遲早的事。

我思考過感到喫力的原因:<br />因爲我的目標是每週發一篇文章,一週之內我需要找到一個文章主題、並且研究這個主題相關的代碼、寫成文章。

其中最費時間的就是研究代碼了,這通常會佔據我一週中大部分用於寫文章的業餘時間。

研究代碼佔用了大量時間,再加上寫文章,這讓我感到越來越喫力。

到 8 月份寫完前面提到的那篇文章之後,有一些複雜的感覺交織在一起:如釋重負、元氣耗盡、迷茫,讓我沒有動力繼續寫下一篇文章了。

這些複雜的感覺交織的過程中,我也在思考接下來要怎麼辦?寫文章這件事怎麼才能做到更輕鬆更持久?

爲此,我先總結了一下我寫文章的幾個階段。

第 1 階段:<br />剛開始研究 MySQL 源碼的時候,我也會寫文章,發到我的博客上。

寫完文章之後還會給同事看,同事說看不懂。

當時我也很鬱悶,我很用心的花了很長時間寫的文章,同事看不懂。

雖然鬱悶,但日子還要繼續過下去,還得繼續研究源碼、繼續寫文章。

第 2 階段:<br />就這樣一邊鬱悶,一邊研究代碼,一邊寫文章,時間就過去了幾個月。

某一天,我又寫了一篇文章,發給同事看。同事看了之後,給出了很不錯的評價。

這讓理解了從讀者的角度來看,什麼樣的文章算是好文章。

接下來的事就順理成章了:註冊公衆號、繼續研究源碼、繼續寫文章。

這裏要鄭重感謝一下我前面提到同事 @李亮,在前期給了我很重要的幫助。

第 3 階段:<br />全職研究代碼,基本上一週發一篇文章。

這個階段雖然沒有收入,但是每天動力很足,有一種感覺就是日子過的紅紅火火。

這叫什麼?這就叫窮開心!

第 4 階段:<br />我上班了,只能利用業餘時間研究代碼。

想要像之前那樣寫長文章,還每週發一篇,已經不太可能實現了。

這個階段的主旋律就是圍繞問題研究代碼、寫文章,同事和讀者有時候會問我一些問題,我就圍繞問題去研究代碼,寫成文章。

開始一段時間,依然樂此不疲。雖然喫力,也還基本能應付過來。

時間一長,喫力感越來越明顯了,持續到 8 月份,寫文章之事就由於不堪重負暫時停了下來。

我還想繼續寫文章,但需要找到一種相對來說更輕鬆的方式,這樣才能可持續發展。

經過一番思考之後,我決定把寫文章的事放一放,先專心研究一段時間代碼,把 InnoDB 幾個主要模塊的細節都研究一遍,再接着寫文章。

時間飛快,轉眼已是四個月,從秋高氣爽到白雪皚皚,我恢復了元氣,又可以繼續寫文章了。

重生的文章,以系列的形式連載,需要新的載體,於是就有了這個專欄。

接下來,就要進入第 5 階段了。這個專欄和第 5 階段相伴而生,我在此許下一個願望:希望專欄和第 5 階段都能夠持續的很久~很久~,和大家一起奔赴未來!

5. 我們一起奔赴未來!

《MySQL 核心模塊揭祕》 專欄預期每週發佈一篇文章,持續一年左右。

接下來的一年,我們一起 探索 InnoDB 事務、鎖、Redo、Undo、MVCC 的底層原理,看看 MySQL 運行時都幹了什麼?

風起於青萍之末,浪成於微瀾之間。下一期(專欄的第 1 篇正式文章)我們會聊聊 InnoDB 事務的起源:事務池和事務池管理器

更多技術文章,請訪問:https://opensource.actionsky.com/

關於 SQLE

SQLE 是一款全方位的 SQL 質量管理平臺,覆蓋開發至生產環境的 SQL 審覈和管理。支持主流的開源、商業、國產數據庫,爲開發和運維提供流程自動化能力,提升上線效率,提高數據質量。

SQLE 獲取

類型 地址
版本庫 https://github.com/actiontech/sqle
文檔 https://actiontech.github.io/sqle-docs/
發佈信息 https://github.com/actiontech/sqle/releases
數據審覈插件開發文檔 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章