­

關於 InnoDB 存儲引擎的一些總結!

  • 2020 年 2 月 14 日
  • 筆記

先說 3 件事吧!

  1. 春節放假期間公眾號不發文。提前祝大家新年快樂!
  2. 公眾號後面可能會改名,有好的名字,可以留言推薦!
  3. 最近喜獲信息系統高級工程師的證書!謝謝朋友圈幾百個粉絲的祝福,這個比 PMP 難考,一年可以考兩次。我是死看書,沒啥訣竅。沒畢業也可以考,有沒有用,看公司,看個人!

時間過的很快,一眨眼一年時間就過去了。過去一年裡,我也和群里的不少朋友一起成長,互相學習到不少東西!下面總結一些,我們經常在群里討論的一些關於 MySQL 的知識點。

1、InnoDB 中每一頁的大小默認為 16kb,但是其也支持壓縮頁的功能,即將原本 16kb 的頁壓縮為 1kb、2kb、4kb 和 8kb。當需要從緩存池中申請 4kb 大小的頁時,MySQL 的申請步驟如下:

  • 檢查 4kb 的 unzip_LRU 列表,檢查是否有可用的空閑頁;
  • 若有,則直接使用;
  • 否則,檢查 8kb 的 unzip_LRU 列表;
  • 若能夠得到空閑頁,則分解為 2 個 4kb 的頁,並且存放到 4kb 的 unzip_LRU 列表;
  • 若不能得到空閑頁,就從 LRU 列表中申請一個 16kb 的頁,將其分解為 1個 8kb 和 2 個 4kb 的頁,並且存放到對應的 unzip_LRU 列表中

2、當 LRU 列表中的頁被修改之後,其數據就和磁盤上的數據產生了不一致,這種頁被稱為臟頁,此時數據庫會根據 checkpoint 機制將臟頁刷新到磁盤中,臟頁不僅存在於 LRU 列表中,也存在於 FLUSH 列表中,FLUSH 列表中的數據是專門用來管理將數據刷新到磁盤中的。

3、在下列三種情況下重做日誌會將重做日誌緩衝中的內容刷新到重做日誌文件中:

  • master thread 每一秒將重做日誌緩衝刷新到重做日誌文件;
  • 每個事務提交時會將重做日誌緩衝刷新到重做日誌文件;
  • 當重做日誌緩衝池剩餘空間小於1/2時,重做日誌緩衝刷新到重做日誌文件。

4、為了避免數據丟失的問題,事務數據庫都採用了 write ahead log 機制,也就是當事務提交時,存儲引擎先將數據寫入到重做日誌中,然後再修改頁中的數據,當數據庫發生宕機時,可以通過重做日誌來恢複數據。

5、為了協調 CPU 的處理速度與磁盤的讀寫速度之間的不匹配問題,MySQL 採用了緩衝池來解決這個問題,當發生數據讀寫時,其都是先將數據寫入到緩衝池中,然後通過 checkpoint 技術將數據寫入到磁盤中。

6、checkpoint 技術所解決的問題:

  • 縮短數據庫的恢復時間;
  • 緩衝池不夠用時,將臟頁刷新到磁盤;
  • 重做日誌不可用時,刷新臟頁。

7、公眾號里之前也總結了不少關於 MySQL 的面試題和知識點。如:

搜了一下,大概有 50 多篇原創 MySQL 文章,都可以在歷史文章里搜索到。我依然推薦大家可以看看《高性能 MySQL》、丁奇大神的《MySQL實戰45講》。

另外我的小程序里也有一些 MySQL 相關的知識點,雖然很久沒更新了!

由於今天臨時有事,這篇文章更新的很晚,很抱歉!最後祝大家鼠年有——

「鼠」不盡的快樂!「鼠」不盡的收穫!

「鼠」不盡的鈔票!「鼠」不盡的笑容!

「鼠」不盡的幸福,「鼠」不盡的幸運!

「鼠」不盡的甜蜜,「鼠」不盡的活力!

2020,「鼠」你最胖!不是,「鼠」你最棒!