MySQL 體系結構

Ryan_Bai發表於2019-01-15

一、物理檔案

  1. 引數檔案
    告訴Mysql例項啟動時在哪裡可以找到資料庫檔案,並且指定某些初始化引數,這些引數定義了某種記憶體結構的大小等設定。用檔案儲存,可編輯,若啟動時載入不到則不能成功啟動(與其他資料庫不同)。引數有動態和靜態之分,靜態相當於只讀,動態是可以set的。如我們透過show variable like '***'查出來的key、value值,是可以透過set key=value直接修改的。同是,修改時還有作用域之分,即這個seesion個有效和全域性有效,在對應的key前加上session或global即可,如select @@seesion。read_buffer_size、set @@global。read_buffer_size。

  2. log file     
    用來記錄Mysql例項對某種條件做出響應時寫入的檔案。如錯誤日誌檔案、二進位制日誌檔案、慢查詢日誌檔案、查詢日誌檔案等。 

  • error log
    透過show variables like 'log_error'來檢視錯誤日誌存放地址

  • slow log
    透過show variables like '%long%' 檢視慢查詢日誌記錄的閾值,新版本設成了0.05;透過show variables like 'log_slow_queries'檢視是否開啟了,預設為關閉的;透過show variabes like 'log_queries_not_using_indexes'檢視是將沒有使用索引的查詢記錄到慢日誌中。mysql中可以直接透過mysqldumpslow命令來檢視慢日誌。

  • general log
    記錄所有資料庫操作記錄,平時不建議開啟

  • bin log
    不記錄查詢,只記錄對資料庫所有的修改操作。目的是為了恢復(point-in-time修復)和複製。透過show variables like 'datadir'檢視存放路徑。二進位制日誌支援STATEMENT、ROW、MIX三種格式,透過binlog_format引數設定,通常設定為ROW,可以為資料庫的恢復和複製帶來更好的可靠性,但會帶來二進位制檔案大小的增加,複製時會增加網路開銷。mysql中透過mysqlbinlog檢視二進位制日誌檔案內容。

  • socket 檔案
    當用Unix域套接字方式進行連線時需要的檔案。

  • pid檔案
    Mysql例項的程式ID檔案。

  • 表結構定義檔案
    用來存放Mysql表結構定義檔案。因為Mysql外掛式儲存引擎的體系結構,每個表都有一個對應的檔案,以frm字尾結尾。 

  • 儲存引擎檔案
    儲存自己的檔案來儲存各種資料,真正儲存了資料和索引等資料。下面主要介紹InnoDB的儲存引擎下的表空間檔案和重做日誌檔案。 

    • 表空間檔案
      InnoDB預設的表空間檔案為ibdata1,可透過show variables like 'innodb_file_per_table'檢視每個表是否產生單獨的。idb表空間檔案。但是,單獨的表空間檔案僅儲存該表的資料、索引和插入緩衝等資訊,其餘資訊還是存放在預設的表空間中。 

    • redo log file
      例項和介質失敗,重做日誌檔案就能派上用場,如資料庫掉電,InnoDB儲存引擎會使用重做日誌恢復到掉電前的時刻,以此來保證資料的完整性。引數innodb_log_file_size指定了重做日誌檔案的大小;innodb_log_file_in_group指定了日誌檔案組中重做日誌檔案的數量,預設為2,innodb_mirrored_log_groups指定了日誌映象檔案組的數量,預設為1,代表只有一個日誌檔案組,沒有映象;innodb_log_group_home_dir指定了日誌檔案組所在路徑,預設在資料庫路徑下。 

    • archive redo log

    二進位制日誌和重做日誌的區別:首先,二進位制日誌會記錄所有與Mysql有關的日誌記錄,包括InnoDB、MyISAM、Heap等其他儲存引擎的日誌。而InnoDB儲存引擎重做日誌只儲存有關其本身的事務日誌;其次內容不同,不管將二進位制日誌檔案記錄的格式設為STATEMENT還是ROW,又或者是MIXED,其記錄的都是關於一個事務的具體操作內容。而InnoDB儲存引擎的重做日誌檔案記錄的關於每個頁的更改的物理情況 。此外,寫入時間不同,二進位制日誌檔案是在事務提交前進行記錄的,而在事務進行的過程中,不斷有重做日誌條目被 寫入重做日誌檔案中。 

    二、執行緒

    1. Master Thread
      負責重新整理快取資料到磁碟並協調排程其它後臺程式。Master thread執行緒的優先順序最高,內部主要是4個迴圈loop組成:主迴圈、後臺迴圈、重新整理迴圈、暫停迴圈。

    • 主迴圈

    1. loop主迴圈每秒一次的操作

    • 日誌緩衝重新整理到磁碟,即使這個事務還沒有提交。(總是執行,所以再大的事務commit 的時間也是很快的) 

    • 合併插入緩衝(innodb當前一秒發生的io次數小於5次則執行)

    • 至多重新整理100個innodb的緩衝池中的髒頁到磁碟(超過配置的髒頁所佔緩衝池比例則執行,在配置檔案中由innodb_max_dirty_pages_pac決定,預設是90,新版本是75,google建議是80)

    • 如果當前沒用使用者活動,切換到backgroud loop

  • loop主迴圈每10秒一次的操作

    • 重新整理100個髒頁到磁碟(過去10秒IO操作小於200次則執行)

    • 合併至多5個插入緩衝(總是)

    • 將日誌緩衝到磁碟(總是)

    • 刪除無用的Undo頁(總是)

    • 重新整理100個或者10個髒頁到磁碟(有超過70%的髒頁,重新整理100個髒頁;否則重新整理10個髒頁)

    • 產生一個檢查點

  • 後臺迴圈

    • 刪除無用的Undo頁(總是)

    • 合併20個插入緩衝(總是)

    • 跳回到主迴圈(總是)

    • 不斷重新整理100個頁,直到符合條件(可能在flush loop中完成)

  • 重新整理迴圈

  • 暫停迴圈

  • Async I/O Thread
    在innodb儲存引擎中大量使用AIO來處理IO請求,這樣可以極大提高資料庫的效能,而IO thread的工作就是負責這些IO請求的回撥處理(call back),InnoDB 共有10個 IO Thread, 分別是 4個 write、4個 read、1個 insert buffer和1個 log thread。

  • Purge Thread
    事務提交後,其所使用的undolog可能不再需要,因此需要改執行緒來回收。InnoDB 引擎預設設定為4個 Purge Thread

    • 刪除附註索引中不存在的記錄;

    • 刪除已經被打了delete-marked標記的記錄

    • 刪除不需要的undo log

  • Page Cleaner Thread
    用於將髒頁的重新整理操作都放入到單獨的執行緒來完成

  • 三、記憶體

    1. Buffer Pool
      InnoDB 儲存引擎是基於磁碟儲存的,其中的記錄按照頁的方式進行管理,由於 CPU 速度和磁碟速度之間的鴻溝, InnoDB 引擎使用緩衝池技術來提高資料庫的整體效能。

    • undo page

    • insert buffer page
      不是緩衝池的一部分,Insert Buffer是物理頁的一個組成部分,它帶來InnoDB效能的提高。根據B+演算法(下文會提到)的特點,插入資料的時候會主鍵索引是順序的,不會造成資料庫的隨機讀取,而對於非聚集索引(即輔助索引),葉子節點的插入不再是順序的了,這時需要離散地訪問非聚集索引,插入效能在這裡變低了。InnoDB引入插入緩衝,判斷非聚集索引頁是否在緩衝池中,如果在則直接插入;不在,則先放在 插入緩衝區中。然後根據上述master thread中介紹的,會有一定的頻率將插入緩衝合併。此外,輔助索引不能是唯一的,因為插入到插入緩衝時,並不去查詢索引頁的情況,否則仍然會造成隨機讀,失去插入緩衝的意義了。插入緩衝可能會佔緩衝池中記憶體,預設也能會佔到1/2,所以可以將這個值調小點,到1/3。透過IBUF_POOL_SIZE_PER_MAX_SIZE來設定,2表示1/2,3表示1/3。

    • adaptive hash index
      InnoDB儲存引擎提出一種自適應雜湊索引,儲存引擎會監控對錶上索引的查詢,如果觀察到建立建立雜湊索引會帶來速度的提升,則建立雜湊索引,所以稱之為自適應的。自適應雜湊索引只能用來搜尋等值的查詢,如select * from table where index_col='***', 此外自適應雜湊是由InnoDB儲存引擎控制的,我們只能透過innodb_adaptive_hash_index來禁用或啟用,預設開啟。 

    • index page

    • data dictionary

    • lock info

  • Redo Log Buffer
    InnoDB 儲存引擎先將重做日誌資訊放入這個緩衝區,然後以一定頻率將其重新整理到重做日誌檔案。重做日誌檔案一般不需要設定得很大,因為在下列三種情況下重做日誌緩衝中的內容會重新整理到磁碟的重做日誌檔案中。

    • Master Thread 每一秒將重做日誌緩衝重新整理到重做日誌檔案

    • 每個事物提交時會將重做日誌緩衝重新整理到重做日誌檔案

    • 當重做日誌緩衝剩餘空間小於1/2時,重做日誌緩衝重新整理到重做日誌檔案

  • Additional Memory Pool
    在 InnoDB 儲存引擎中, 對一些資料結構本身的記憶體進行分配時,需要從額外的記憶體池中進行申請。例如,分配了緩衝池,但是每個緩衝池中的幀緩衝還有對應的緩衝控制物件,這些物件記錄以一些諸如 LRU, 鎖,等待等資訊,而這個物件的記憶體需要從額外的記憶體池中申請。

  •  


    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2558402/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章