淺談 MySQL InnoDB 的內存組件

本文讀完需7分鐘,速讀僅需4分鐘。


前言

MySQL中執行一條SQL語句,相應表數據的讀寫都是由存儲引擎去做(更新數據、查詢數據)。

在這個過程,存儲引擎需要決策一些事情

  • 數據是從內存查還是從硬盤查
  • 數據是更新在內存,還是硬盤
  • 內存的數據什麼時候同步到硬盤

所以存儲引擎會按照內部邏輯與內存、硬盤交互。

我們可以按需選擇存儲引擎,比如常見的 InnoDB、MyISAM、Memory 等等。

衆多存儲引擎中,InnoDB是最爲常用的,從 MySQL5.5.8 版本開始,InnoDB是默認的存儲引擎。

InnoDB簡介

InnoDB存儲引擎支持事務,其設計目標主要面向在線事務處理(OLTP)的應用。

特點是行鎖設計、支持MVCC、外鍵,提供一致性非鎖定讀,同時本身設計能夠最有效的利用內存和CPU,是 MySQL 最常用的存儲引擎。

InnoDB的重要內存結構

InnoDB存儲引擎在內存中有兩個非常重要的組件,分別是緩衝池(Buffer Pool)和重做日誌緩存(redo log buffer)。

Buffer Pool簡介

緩衝池(Buffer Pool)裏面會緩存很多的數據,比如數據頁、索引頁、鎖信息等等。

MySQL表數據是以頁爲單位,你查詢一條記錄,會從硬盤把一頁的數據加載出來,加載出來的數據叫數據頁,會放入到 Buffer Pool 中。

後續的查詢先從 Buffer Pool 中找,沒有命中再去硬盤加載,減少硬盤 IO 開銷,提升性能。

更新表數據的時,如果 Buffer Pool 裏命中數據,就直接在 Buffer Pool 裏更新。

總之 Buffer Pool 會緩存很多的數據,以便後續的查詢與更新。

小貼士:這裏只是用數據頁舉例幫助大家理解,大家千萬不要認爲 Buffer Pool 裏面只有數據頁,它只是佔 Buffer Pool 大部分空間,關於 Buffer Pool 更多細節,後續會有專門的文章講解。

redo log buffer簡介

接着思考一個問題,假設我們把 Buffer Pool 中某個數據頁的某條數據修改了,但是硬盤的數據還未同步,此時數據是不一致的,如果 MySQL 宕機了,數據就丟失了。

這可怎麼辦呢。

爲了保證數據的持久性,InnoDB存儲引擎加入了 redo 日誌功能,也叫重做日誌。

每當我們對錶數據進行更新時,會把“在某個數據頁上做了什麼修改”記錄到重做日誌緩存(redo log buffer)裏。

當事務提交時,會把 redo log buffer 清空,刷盤到 redo 日誌文件。

這樣 MySQL 宕機了也沒關係,因爲重啓後會根據 redo 日誌去恢復數據。

小貼士:redo日誌細節也很多,本文只做個介紹,後續會有專門的文章講解。

小結

其實不難發現,緩衝池(Buffer Pool)和重做日誌緩存(redo log buffer),它們都是爲了減少硬盤 IO 開銷。

因爲 Buffer Poolredo 日誌涉及內容較多,後面會出兩篇文章單獨講。

今天講的這些內容全是在給後面的文章做鋪墊,大家先知道它們是幹嘛的,留個印象就行了。

站在巨人的肩膀上:

  • 《MySQL實戰45講》
  • 《從零開始帶你成爲MySQL實戰優化高手》
  • 《MySQL是怎樣運行的:從根兒上理解MySQL》
  • 《MySQL技術Innodb存儲引擎》

本文分享自微信公衆號 - 武培軒(wupeixuan404)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章