MYSQL-->InnoDB引擎底層原理( 二 )


查看變量 innodb_file_per_table看是開的還是關的
里面存放了表結構 , 表數據,索引
General Tablespaces(通用表空間)通用表空間,需要手動通過
create tablespace 表空間名 add datafile '表空間對應的磁盤文件.ibd' engine=innodb;創建通用表空間 。
在創建表的時候可以指定該表空間
create table 表名( 字段....)engine=存儲引擎 tablespace 表空間名;Undo Tablespaces(撤銷表空間)撤銷表空間,MYSQL實例在初始化的時候會自動創建倆個默認的undo表空間(初始大小16M)用來存放undo log日志
默認叫 undo_001和undo_002
Temporary Tablespaces(臨時表空間)用來存儲用戶創建的臨時表 。
Doublewrite Buffer Files(雙寫緩沖區)雙寫緩沖區,innoDB存儲引擎會將數據頁沖Buffer Pool刷新到磁盤前,先將數據頁寫入雙寫緩沖區文件中,便于系統異常時恢復數據 。
雙寫緩沖區文件:xxx.dblwr
Redo Log(重做日志)用來實現事務的持久性 。
該日志文件由倆個部分組成:重做日志緩沖區(redo log buffer)和重做日志文件(redo log)
重做日志緩沖區:是在內存中
重做日志文件:是在磁盤在
事務提交后會把所有修改的信息存放在該日志中,用于刷新臟頁到磁盤,發生錯誤時,進行數據恢復使用
以循環的方式寫入重做文件,涉及到倆個文件:ib_logfile0和ib_logfile1
后臺線程作用:將Innodb緩沖池的數據在合適的時機刷新到磁盤文件中 。
分為四類:
  1. Master Thread
    核心后臺線程,負責調度其他線程 。還負責將緩沖池中的數據異步刷新到磁盤中,保持數據的一致性 。
    還包括 , 臟頁的刷新 , 合并插入緩沖,undo頁的回收
  2. IO Thread
    在InoDB存儲引擎中大量使用了AIO來處理IO請求,這樣可以極大提高數據庫性能,IO Thread主要負責以下IO請求的回調
    線程類型默認個數責任Read thread4負責讀操作write thread4負責寫操作Log thread1負責將日志緩沖區刷新到磁盤Insert buffer thread1負責將寫緩沖區內容刷新到磁盤
    關于AIO(異步IO)和IO(同步IO)
    同步就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回 。也就是必須一件一件事做 , 等前一件事做完了才能做下一件事 。
    異步的概念和同步相對 。當一個異步過程調用發出后,調用者不能立刻得到結果(在此期間,調用者可以去干一些別的事情) 。實際處理這個調用的部件在完成后,通過狀態、通知和回調 。
  3. Purge Thread
    主要用于回收事務已經提交的undo log,在事務提交之后 , undo log可能不需要了,就用這個來回收 。
  4. Page Cleaner Thread
    協助Master Thread刷新臟頁到磁盤的線程,他可以減輕Master Thread的工作壓力,減少阻塞 。
整個流程在增刪改查的時候,會操作內存結構區域,如果里面沒有數據就從 。磁盤結構中加載 , 然后進行操作 。
最后在特定時間會自動從內存結構中刷新到磁盤中 。在磁盤中進行持久化保存下來
事務原理事務事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有操作作為一個整體一起向系統提交撤銷操作請求 。
這些操作要么同時成功要么同時失敗 。
事務的四大性質
  1. 原子性
    事務是不可分割的最小操作單元 , 要么全部成功,要么全部失敗 。
  2. 一致性
    事務完成時 , 必須使所有的數據保持一致性 。
  3. 隔離性
    數據庫系統提高隔離機制,保證事務在不受外部并發操作影響的獨立環境運行 。
  4. 持久性
    事務一旦提交或回滾,他對數據庫的數據改變就是永久的 。
事務的原理事務的原子性,一致性,持久性都是由redo log和undo log實現的
事務的隔離性是由 鎖機制和MVCC實現的 。
redo log重做日志,記錄的是事務提交時數據頁的物理修改,用來實現事務的持久性 。
該日志文件由倆部分組成:
  1. 重做日志緩沖(redo log buffer)
    在內存中
  2. 重做日志文件(redo log file)
    在磁盤中
當事務提交后會把所有修改信息都存放到該日志文件中 , 用于在刷新臟頁到磁盤中,發生錯誤時 , 進行數據的恢復 。
大概流程:

推薦閱讀