本文讀完需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 Pool
與 redo
日誌涉及內容較多,後面會出兩篇文章單獨講。
今天講的這些內容全是在給後面的文章做鋪墊,大家先知道它們是幹嘛的,留個印象就行了。
站在巨人的肩膀上:
-
《MySQL實戰45講》 -
《從零開始帶你成爲MySQL實戰優化高手》 -
《MySQL是怎樣運行的:從根兒上理解MySQL》 -
《MySQL技術Innodb存儲引擎》
本文分享自微信公衆號 - 武培軒(wupeixuan404)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。