InnoDB 存儲結構 (瞭解便可)

Thresh

從MySQL 5.5版本開始默認使用InnoDB做爲引擎,它擅長處理事務,具備自動崩潰恢復的特性。下面是官方的InnoDB引擎架構圖,主要分爲內存結構和磁盤結構兩大部分。
imagemysql

InnoDB 內存結構

內存結構主要包括Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大組件。算法

Buffer Pool:緩衝池,簡稱BP。

BP以Page頁爲單位,默認大小16K,BP的底層採用鏈表數據結構管理Page。在InnoDB訪問表記錄和索引時會在Page頁中緩存,之後使用能夠減小磁盤IO操做,提高效率。sql

Page管理機制
Page根據狀態能夠分爲三種類型:數據庫

free page :空閒page,未被使用
    clean page:被使用page,數據沒有被修改過
    dirty page:髒頁,被使用page,數據被修改過,頁中數據和磁盤的數據產生了不一致

針對上述三種page類型,InnoDB經過三種鏈表結構來維護和管理緩存

free list :表示空閒緩衝區,管理free page
    
    flush list:表示須要刷新到磁盤的緩衝區,管理dirty page,內部page按修改時間排序。
        髒頁即存在於flush鏈表,也在LRU鏈表中,可是兩種互不影響
        LRU鏈表負責管理page的可用性和釋放,而flush鏈表負責管理髒頁的刷盤操做。
        
    lru list:表示正在使用的緩衝區,管理clean page和dirty page
        緩衝區以midpoint爲基點,前面鏈表稱爲new列表區
        存放常常訪問的數據,佔63%;後面的鏈表稱爲old列表區,存放使用較少數據,佔37%。

改進型LRU算法維護服務器

  • 普通LRU:
末尾淘汰法,新數據從鏈表頭部加入,釋放空間時從末尾淘汰
  • 改性LRU:
鏈表分爲new和old兩個部分,加入元素時並非從表頭插入,而是從中間midpoint位置插入,若是數據很快被訪問,那麼page就會向new列表頭部移動,若是數據沒有被訪問,會逐步向old尾部移動,等待淘汰。
  • 每當有新的page數據讀取到buffer pool時,InnoDb引擎會判斷是否有空閒頁,是否足夠,若是有就將free page從free list列表刪除,放入到LRU列表中。沒有空閒頁,就會根據LRU算法淘汰LRU鏈表默認的頁,將內存空間釋放分配給新的頁。

Buffer Pool配置參數session

show variables like '%innodb_page_size%'; //查看page頁大小
show variables like '%innodb_old%'; //查看lru list中old列表參數
show variables like '%innodb_buffer%'; //查看buffer pool參數

建議:將innodb_buffer_pool_size設置爲總內存大小的60%-80%,
innodb_buffer_pool_instances能夠設置爲多個,這樣能夠避免緩存爭奪。

Change Buffer:寫緩衝區,簡稱CB。

在進行DML操做時,若是BP沒有其相應的Page數據,並不會馬上將磁盤頁加載到緩衝池,而是在CB記錄緩衝變動,等將來數據被讀取時,再將數據合併恢復到BP中。
ChangeBuffer佔用BufferPool空間,默認佔25%,最大容許佔50%,能夠根據讀寫業務量來
進行調整。數據結構

參數 innodb_change_buffer_max_size;

當更新一條記錄時,該記錄在BufferPool存在,直接在BufferPool修改,一次內存操做。若是該記錄在BufferPool不存在(沒有命中),會直接在ChangeBuffer進行一次內存操做,不用再去磁盤查詢數據,避免一次磁盤IO。當下次查詢記錄時,會先進性磁盤讀取,而後再從ChangeBuffer中讀取信息合併,最終載入BufferPool中。架構

寫緩衝區,僅適用於非惟一普通索引頁,爲何?優化

若是在索引設置惟一性,在進行修改時,InnoDB必需要作惟一性校驗,所以必須查詢磁盤,作一次IO操做。會直接將記錄查詢到BufferPool中,而後在緩衝池修改,不會在ChangeBuffer操做。

Adaptive Hash Index:自適應哈希索引,用於優化對BP數據的查詢。

InnoDB存儲引擎會監控對錶索引的查找,若是觀察到創建哈希索引能夠帶來速度的提高,則創建哈希索引,因此稱之爲自適應。InnoDB存儲引擎會自動根據訪問的頻率和模式來爲某些頁創建哈希索引。

Log Buffer:日誌緩衝區

用來保存要寫入磁盤上log文件(Redo/Undo)的數據,日誌緩衝區的內容按期刷新到磁盤log文件中。日誌緩衝區滿時會自動將其刷新到磁盤,當遇到 BLOB或多行更新的大事務操做時,增長日誌緩衝區能夠節省磁盤I/O。
LogBuffer主要是用於記錄 InnoDB引擎日誌,在 DML操做時會產生RedoUndo日誌。
LogBuffer空間滿了,會自動寫入磁盤。能夠經過將 innodb_log_buffer_size 參數調大,減小磁盤IO頻率innodb_flush_log_at_trx_commit參數控制日誌刷新行爲,默認爲1

0:每隔1秒寫日誌文件和刷盤操做(寫日誌文件LogBuffer-->OS cache,刷盤OS cache-->磁盤文件),最多丟失1秒數據
1:事務提交,馬上寫日誌文件和刷盤,數據不丟失,可是會頻繁IO操做
2:事務提交,馬上寫日誌文件,每隔1秒鐘進行刷盤操做

InnoDB 磁盤結構

InnoDB磁盤主要包含 Tablespaces,InnoDB Data Dictionary,Doublewrite Buffer、Redo Log 和 Undo Logs。

表空間(Tablespaces)

用於存儲表結構和數據。表空間又分爲系統表空間、獨立表空間、通用表空間、臨時表空間、Undo表空間等多種類型;

系統表空間(The System Tablespace)
包含InnoDB數據字典,Doublewrite Buffer,Change Buffer,Undo Logs的存儲區域。系統表空間也默認包含任何用戶在系統表空間建立的表數據和索引數據。系統表空間是一個共享的表空間由於它是被多個表共享的。該空間的數據文件經過參數innodb_data_file_path控制,默認值是ibdata1:12M:autoextend(文件名爲ibdata一、12MB、自動擴展)

獨立表空間(File-Per-Table Tablespaces)
默認開啓,獨立表空間是一個單表表空間,該表建立於本身的數據文件中,而非建立於系統表空間中。當innodb_file_per_table選項開啓時,表將被建立於表空間中。不然,innodb將被建立於系統表空間中。每一個表文件表空間由一個.ibd數據文件表明,該文件默認被建立於數據庫目錄中。表空間的表文件支持動態(dynamic)和壓縮(commpressed)行格式。

通用表空間(General Tablespaces)
通用表空間爲經過create tablespace語法建立的共享表空間。通用表空間能夠建立於mysql數據目錄外的其餘表空間,其能夠容納多張表,且其支持全部的行格式。

CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd Engine=InnoDB; //建立表空間ts1 
CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1; //將表添加到ts1表空間

撤銷表空間(Undo Tablespaces)
撤銷表空間由一個或多個包含Undo日誌文件組成。在MySQL 5.7版本以前Undo佔用的是System Tablespace共享區,從5.7開始將Undo從System Tablespace分離了出來。InnoDB使用的undo表空間由innodb_undo_tablespaces配置選項控制,默認爲0。參數值爲0表示使用系統表空間ibdata1;大於0表示使用undo表空間undo_00一、undo_002等。

臨時表空間(Temporary Tablespaces)
分爲session temporary tablespaces 和global temporary tablespace兩種。

session temporary tablespaces 存儲的是用戶建立的臨時表和磁盤內部的臨時表。 
global temporary tablespace 存儲用戶臨時表的回滾段(rollback segments )。 
mysql服務器正常關閉或異常終止時,臨時表空間將被移除,每次啓動時會被從新建立。

重作日誌(Redo Log)

重作日誌是一種基於磁盤的數據結構,用於在崩潰恢復期間更正不完整事務寫入的數據。
MySQL以循環方式寫入重作日誌文件,記錄InnoDB中全部對Buffer Pool修改的日誌。當出現實例故障(像斷電),致使數據未能更新到數據文件,則數據庫重啓時須redo,從新把數據更新到數據文件。讀寫事務在執行的過程當中,都會不斷的產生redo log。默認狀況下,重作日誌在磁盤上由兩個名爲ib_logfile0和ib_logfile1的文件物理表示。

撤銷日誌(Undo Logs)

撤消日誌是在事務開始以前保存的被修改數據的備份,用於例外狀況時回滾事務。撤消日誌屬於邏輯日誌,根據每行記錄進行記錄。撤消日誌存在於系統表空間、撤消表空間和臨時表空間中。

相關文章
相關標籤/搜索