<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### Buffer Pool 為了緩存磁盤中的頁,在`MySQL`服務器啟動的時候就向操作系統申請了一片連續的內存,他們給這片內存起了個名,叫做`Buffer Pool`(中文名是`緩沖池`)。 默認情況下`Buffer Pool`只有`128M`大小。當然如果你嫌棄這個`128M`太大或者太小,可以在啟動服務器的時候配置`innodb_buffer_pool_size`參數的值,它表示`Buffer Pool`的大小,就像這樣: ~~~ [server] # 單位是字節 innodb_buffer_pool_size = 268435456 ~~~ ### Buffer Pool內部組成 `Buffer Pool`中默認的緩存頁大小和在磁盤上默認的頁大小是一樣的,都是`16KB`。 為了更好的管理這些在`Buffer Pool`中的緩存頁,每一個緩存頁都創建了一些所謂的`控制信息`,這些控制信息包括該頁所屬的表空間編號、頁號、緩存頁在`Buffer Pool`中的地址、鏈表節點信息、一些鎖信息以及`LSN`信息 每個緩存頁對應的控制信息占用的內存大小是相同的,我們就把每個頁對應的控制信息占用的一塊內存稱為一個`控制塊`吧,**控制塊和緩存頁是一一對應的**,它們都被存放到 Buffer Pool 中,其中控制塊被存放到 Buffer Pool 的前邊,緩存頁被存放到 Buffer Pool 后邊,所以整個`Buffer Pool`對應的內存空間看起來就是這樣的: ![](https://img.kancloud.cn/02/68/0268de28d90626f69a8a7eca13f8e7cc_1004x339.png) 每個控制塊大約占用緩存頁大小的5%,在MySQL5.7.21這個版本中,每個控制塊占用的大小是808字節。而我們設置的innodb_buffer_pool_size并不包含這部分控制塊占用的內存空間大小,也就是說InnoDB在為Buffer Pool向操作系統申請連續的內存空間時,這片連續的內存空間一般會比innodb_buffer_pool_size的值大5%左右。 ### free鏈表的管理(空閑鏈表) 啟動`MySQL`服務器的時候,需要對`Buffer Pool`初始化,就是先向操作系統申請`Buffer Pool`的內存空間,然后把它劃分成若干對控制塊和緩存頁。此時`Buffer Pool`是空的。隨著程序的運行,會不斷的有磁盤上的頁被緩存到`Buffer Pool`中。但是這時候沒法判斷`Buffer Pool`中那些緩存頁是使用的,那些是空閑的。這個時候緩存頁對應的`控制塊`就派上大用場了,我們可以把所有空閑的緩存頁對應的控制塊作為一個節點放到一個鏈表中,這個鏈表也可以被稱作`free鏈表`(或者說空閑鏈表)。 剛剛完成初始化的`Buffer Pool`中所有的緩存頁都是空閑的,所以每一個緩存頁對應的控制塊都會被加入到`free鏈表`中, ![](https://img.kancloud.cn/28/0b/280b6775ce9f9a84d07a7b36de16679a_1010x606.png) 從圖中可以看出,我們為了管理好這個`free鏈表`,特意為這個鏈表定義了一個`基節點`,里邊兒包含著鏈表的頭節點地址,尾節點地址,以及當前鏈表中節點的數量等信息。這里需要注意的是,鏈表的基節點占用的內存空間并不包含在為`Buffer Pool`申請的一大片連續內存空間之內,而是單獨申請的一塊內存空間。 鏈表基節點占用的內存空間并不大,在MySQL5.7.21這個版本里,每個基節點只占用40字節大小。后邊我們即將介紹許多不同的鏈表,它們的基節點和free鏈表的基節點的內存分配方式是一樣一樣的,都是單獨申請的一塊40字節大小的內存空間,并不包含在為Buffer Pool申請的一大片連續內存空間之內。 有了這個`free鏈表`之后事兒就好辦了,每當需要從磁盤中加載一個頁到`Buffer Pool`中時,就從`free鏈表`中取一個空閑的緩存頁,并且把該緩存頁對應的`控制塊`的信息填上(就是該頁所在的表空間、頁號之類的信息),然后把該緩存頁對應的`free鏈表`節點從鏈表中移除,表示該緩存頁已經被使用了~ ### 緩存頁的哈希處理 我們怎么知道該頁在不在`Buffer Pool`中呢?難不成需要依次遍歷`Buffer Pool`中各個緩存頁么?一個`Buffer Pool`中的緩存頁這么多都遍歷完豈不是要累死? 根據`表空間號 + 頁號`來定位一個頁的,也就相當于`表空間號 + 頁號`是一個`key`,`緩存頁`作為`value`創建一個哈希表,在需要訪問某個頁的數據時,先從哈希表中根據`表空間號 + 頁號`看看有沒有對應的緩存頁,如果有,直接使用該緩存頁就好,如果沒有,那就從`free鏈表`中選一個空閑的緩存頁,然后把磁盤中對應的頁加載到該緩存頁的位置。 ### flush鏈表的管理 如果我們修改了`Buffer Pool`中某個緩存頁的數據,那它就和磁盤上的頁不一致了,這樣的緩存頁也被稱為`臟頁`(英文名:`dirty page`)。 由于頻繁的往磁盤中寫數據會嚴重的影響程序的性能,所以每次修改緩存頁后,我們并不著急立即把修改同步到磁盤上,而是在未來的某個時間點進行同步。 由于不立即同步到磁盤,mysql把凡是修改過的緩存頁對應的控制塊都會作為一個節點加入到一個鏈表中,因為這個鏈表節點對應的緩存頁都是需要被刷新到磁盤上的,所以也叫`flush鏈表`。鏈表的構造和`free鏈表`差不多,假設某個時間點`Buffer Pool`中的臟頁數量為`n`,那么對應的`flush鏈表`就長這樣: ![](https://img.kancloud.cn/44/fb/44fb0604dad42a0728b29a18a0bb03e6_1010x591.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看