1. 淺談 MySQL InnoDB 的內(nèi)存組件

        共 1388字,需瀏覽 3分鐘

         ·

        2021-07-29 09:14

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

        63e2ab1744080729e08d0f814fbe647e.webp


        前言

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

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

        • 數(shù)據(jù)是從內(nèi)存查還是從硬盤查
        • 數(shù)據(jù)是更新在內(nèi)存,還是硬盤
        • 內(nèi)存的數(shù)據(jù)什么時候同步到硬盤

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

        e1c0df492ab03a604d8a47b5c8322744.webp

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

        b692c02a4b18430488c119e2d0d23d3c.webp

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

        InnoDB簡介

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

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

        InnoDB的重要內(nèi)存結(jié)構(gòu)c3e16afe6e6ea0cbd3a49718b6af66b0.webp

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

        Buffer Pool簡介

        緩沖池(Buffer Pool)里面會緩存很多的數(shù)據(jù),比如數(shù)據(jù)頁、索引頁、鎖信息等等。

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

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

        更新表數(shù)據(jù)的時,如果 Buffer Pool 里命中數(shù)據(jù),就直接在 Buffer Pool 里更新。

        39cf8a11bccd8fca5c3f5972514fe8a2.webp

        總之 Buffer Pool 會緩存很多的數(shù)據(jù),以便后續(xù)的查詢與更新。

        小貼士:這里只是用數(shù)據(jù)頁舉例幫助大家理解,大家千萬不要認為 Buffer Pool 里面只有數(shù)據(jù)頁,它只是占 Buffer Pool 大部分空間,關(guān)于 Buffer Pool 更多細節(jié),后續(xù)會有專門的文章講解。

        redo log buffer簡介

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

        eaf175684f530767e18af10a1f099a9d.webp

        這可怎么辦呢。

        為了保證數(shù)據(jù)的持久性,InnoDB存儲引擎加入了 redo 日志功能,也叫重做日志。

        每當我們對表數(shù)據(jù)進行更新時,會把“在某個數(shù)據(jù)頁上做了什么修改”記錄到重做日志緩存(redo log buffer)里。

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

        1b62e14ba91d7154692d56c5c0b1b241.webp

        這樣 MySQL 宕機了也沒關(guān)系,因為重啟后會根據(jù) redo 日志去恢復數(shù)據(jù)。

        77fce9f95dbf4cc9677e2180c7f7b8d8.webp

        小貼士:redo日志細節(jié)也很多,本文只做個介紹,后續(xù)會有專門的文章講解。

        小結(jié)

        其實不難發(fā)現(xiàn),緩沖池(Buffer Pool)和重做日志緩存(redo log buffer),它們都是為了減少硬盤 IO 開銷。

        因為 Buffer Poolredo 日志涉及內(nèi)容較多,后面會出兩篇文章單獨講。

        今天講的這些內(nèi)容全是在給后面的文章做鋪墊,大家先知道它們是干嘛的,留個印象就行了。

        站在巨人的肩膀上:

        • 《MySQL實戰(zhàn)45講》
        • 《從零開始帶你成為MySQL實戰(zhàn)優(yōu)化高手》
        • 《MySQL是怎樣運行的:從根兒上理解MySQL》
        • 《MySQL技術(shù)Innodb存儲引擎》
        瀏覽 34
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 男人天堂网最新 | 日韩一级免费大片 | 精品日韩人妻一区二区三中文字幕 | 总裁受高h奶水双性吃奶男男 | 淫荡留学生激情 |