<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1526字,需瀏覽 4分鐘

           ·

          2022-03-07 23:01

          前言

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

          在這個(gè)過(guò)程,存儲(chǔ)引擎需要決策一些事情

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

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

          我們可以按需選擇存儲(chǔ)引擎,比如常見(jiàn)的 InnoDB、MyISAM、Memory 等等。

          眾多存儲(chǔ)引擎中,InnoDB是最為常用的,從 MySQL5.5.8 版本開(kāi)始,InnoDB是默認(rèn)的存儲(chǔ)引擎。

          InnoDB簡(jiǎn)介

          InnoDB存儲(chǔ)引擎支持事務(wù),其設(shè)計(jì)目標(biāo)主要面向在線事務(wù)處理(OLTP)的應(yīng)用。

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

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

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

          Buffer Pool簡(jiǎn)介

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

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

          后續(xù)的查詢先從 Buffer Pool 中找,沒(méi)有命中再去硬盤(pán)加載,減少硬盤(pán) IO 開(kāi)銷(xiāo),提升性能。

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

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

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

          redo log buffer簡(jiǎn)介

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

          這可怎么辦呢。

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

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

          當(dāng)事務(wù)提交時(shí),會(huì)把 redo log buffer 清空,刷盤(pán)到 redo 日志文件。

          這樣 MySQL 宕機(jī)了也沒(méi)關(guān)系,因?yàn)橹貑⒑髸?huì)根據(jù) redo 日志去恢復(fù)數(shù)據(jù)。

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

          小結(jié)

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

          因?yàn)?Buffer Poolredo 日志涉及內(nèi)容較多,后面會(huì)出兩篇文章單獨(dú)講。

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

          站在巨人的肩膀上:

          • 《MySQL實(shí)戰(zhàn)45講》
          • 《從零開(kāi)始帶你成為MySQL實(shí)戰(zhàn)優(yōu)化高手》
          • 《MySQL是怎樣運(yùn)行的:從根兒上理解MySQL》
          • 《MySQL技術(shù)Innodb存儲(chǔ)引擎》

          如有文章對(duì)你有幫助,

          在看”和轉(zhuǎn)發(fā)是對(duì)我最大的支持!

          一款牛逼的Java面試題庫(kù),點(diǎn)擊下圖查看詳細(xì)內(nèi)容


          瀏覽 59
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级A片一毛片大全 | 麻豆大屌性交 | 五月天婷婷丁香网 | 99免费金品6 | 人人爱,人人操 |