免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

MysqlInnodb體系結構

    

成都創新互聯專注于網站建設,為客戶提供成都做網站、成都網站設計、網頁設計開發服務,多年建網站服務經驗,各類網站都可以開發,成都品牌網站建設,公司官網,公司展示網站,網站設計,建網站費用,建網站多少錢,價格優惠,收費合理。

Innodb體系結構

  • Innodb存儲引擎主要包括內存池以及后臺線程。

  • 內存池:多個內存塊組成一個內存池,主要維護進程/線程的內部數據、緩存磁盤數據,修改文件前先修改內存、redo log

  • 后臺線程:刷新內存池中的額

內存

緩沖池
  • Innodb的數據以頁的形式存儲在磁盤,因此采用內存作為緩存頁數據。

  • 讀頁數據時,先將磁盤上的頁數據“FIX”到緩沖池,下次讀即可直接從緩沖池中讀。

  • 修改數據時,先修改緩沖池中的頁數據,然后刷新到磁盤,并不是每次都刷新而是通過Checkpoint機制刷新到磁盤。

  • 數據頁類型:索引頁、數據頁、undo頁、插入緩沖(insert buffer)、自適應哈希索引、鎖信息、數據字典信息等

  • 緩存池通過LRU算法管理。

LRU、Free List、Flush List
  • 普通LRU:最頻繁的處于列表前端,最少使用處于尾端,先釋放列表尾端的頁。

  • Innodb LRU:在LRU隊列中加入midpoint位置,默認值5/8,表示新讀取的頁加入到列表的5/8位置。midpoint之后列表成為old表,之前稱為new表。即列表尾端到表尾37%為old表,其余為new表。new表存放活躍數據。

  • Free List:數據庫啟動時LRU表為空,頁均存放在Free List中。需要使用時從該表中獲取。

  • Flush List管理緩存中被修改過的頁。

  • unzip_LRU,壓縮頁大小為1、2、4、8KB,其還是屬于LRU管理。unzip_LRU對不同大小頁分開管理,采用伙伴算法分配內存。

redo log buffer

redo log先都寫入該buffer,而后按一定頻率刷新到磁盤(1s/次),默認8M。其刷到磁盤主要一下幾個情況:

  1. Master Thread每秒執行一次。

  2. 事物提交時。

  3. redo log buffer剩余空間小于1/2。

額外的內存池

對一些數據結構本身的內存分配是從額外內存池分配。


線程

Master Thread

負責將緩存池中的數據異步刷新到磁盤,包括臟頁。合并插入緩存(INSERT BUFFER)、UNDO頁的回收等。

IO Thread

Innodb中大量使用AIO處理寫請求,IO Thread則主要處理這些請求的回調,包括write、read、insert buffer和log IO Thread。

Purge Thread

主要用來回收undo log,Innodb1.1之前由Master Thread負責。

Page Cleaner Thread

清理已提交事物的UNDO log。


Checkpoint

事務型數據庫一般采用Write Ahead Log策略,當事物提交時先寫redo log而后修改內存中的頁。當數據庫宕機對于還未寫入磁盤的修改數據可以通過redo log恢復。Checkpoint作用在于保證該點之前的所有修改的頁均已刷新到磁盤,這之前的redo log在恢復數據時可以不需要了。

Sharp Checkpoint

發生在數據庫關閉時,將所有臟頁寫入磁盤,數據庫運行時一般不使用。

Fuzzy Checkpoint

只刷新部分部分臟頁。

  1. Master Thread Checkpoint:Master Thread異步已一定頻率刷新一定比例臟頁。

  2. Flush_LRU_LIST Checkpoint:為了保證LRU中有一定數量的空閑頁,Page Clear Thread將對LRU中尾端頁進行移除,如果存在臟頁則做刷新。

  3. Async/Sync Flush Checkpoint:為了保證redo log循環使用(覆蓋),對于需要將redo文件中不可用的臟頁進行刷新到磁盤。

  4. Dirty Page too much Checkpoint:臟頁數量太多。


Master Thread工作方式

Innodb 1.2.x之前

主要包括主loop、background loop、flush loop和suspend loop。其中的參數可以配置。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

while(true){

    //差不多1s一次

    for(int in 0..9){

        刷新日志緩存到磁盤

        //1s內的統計值

        if IO < 5

            合并插入緩存

        if 臟頁比例 > 預定值

            刷新部分臟頁(不超過100)

        if  沒有用戶活動

            進入background loop{

                刪除無用undo頁

                合并20個插入緩沖

                可能跳到flush loop{

                    可能跳到suspend loop

                }

                跳回主loop

            }

        sleep 1s;

    }

    //差不多10s一次

    if IO < 200 //10s內

        刷新100個臟頁到磁盤

    合并最多5個插入緩沖

    刷新日志緩沖

    刪除無用undo

    刷新100或10個臟頁

}

Innodb 1.2.x

Master Thread中的臟頁刷新功能完全由Page Cleaner Thread執行。

+ View Code

nnodb關鍵特性

插入緩沖
  • 當插入數據需要更新非聚集索引時,如果每次都更新則需要進行多次隨機IO,因此將這些值寫入緩沖對相同頁的進行合并提高IO性能。

  • 插入非聚集索引時,先判斷該索引頁是否在緩沖池中,在則直接插入。否則寫入到Insert Buffer對象。

  • 條件:二級索引,索引不能是unique(因為如果是unique則必須保證唯一性,此時得檢查所有索引頁,還是隨機IO了)

  • Change Buffer:包括Insert Buffer、Delete Buffer、Purge Buffer,update操作包括將記錄標記為已刪除和真正將記錄刪除兩個過程,對應后兩個Buffer。

  • Insert Buffer內部是一顆B+樹

  • Merge Insert Buffer三種情況:

  1. 對應的索引頁被讀入緩沖池。

  2. 對應的索引頁的可用空間小于1/32,則強制進行合并。

  3. Master Thread中的合并插入緩沖。

兩次寫

在對臟頁刷新到磁盤時,如果某一頁還沒寫完就宕機,此時該頁數據已經混亂無法通過redo實現恢復。innodb提供了doublewrite機制,其刷新臟頁步驟如下:

1

2

3

1. 先將臟頁數據復制到doublewrite buffer中(2MB內存)

2. 將doublewrite buffer分兩次,每次1MB寫入到doublewrite磁盤(2MB)中。

3. 馬上同步臟頁數據到磁盤。對于數據混亂的頁則可以從doublewrite中讀取到,該頁寫到共享表空間。

自適應哈希索引

InnoDB存儲引擎會監控對表上索引的查找,如果觀察到建立哈希索引可以帶來速度的提升,則建立哈希索引,所以稱之為自適應(adaptive) 的。自適應哈希索引通過緩沖池的B+樹構造而來,因此建立的速度很快。而且不需要將整個表都建哈希索引,InnoDB存儲引擎會自動根據訪問的頻率和模式 來為某些頁建立哈希索引。

異步IO

linux和windows中提供異步IO,其可以對連續的頁做合并連續頁的IO操作使隨機IO變順序IO。

刷新鄰接頁

刷新頁時判斷相鄰頁是否也是臟頁。

網站標題:MysqlInnodb體系結構
標題路徑:http://m.newbst.com/article36/isjhsg.html

成都網站建設公司_創新互聯,為您提供企業建站虛擬主機域名注冊外貿建站網站導航App設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管