淺談 MySQL InnoDB 的內存組件

前言

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 日誌涉及內容較多,後面會出兩篇文章單獨講。

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

站在巨人的肩膀上:

關於我

阿星是一個熱愛技術的Java程序猿,公衆號**「程序猿阿星」**定期分享有趣有料的精品原創文章!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ntFIufPHj5960n3S7TkPkA