MYSQL-->InnoDB引擎底層原理

邏輯存儲結構邏輯存儲結構圖

MYSQL-->InnoDB引擎底層原理

文章插圖
  1. 表空間
    表空間文件在Linux下存放在 /var/lib/mysql文件中的 xxx.ibd 文件就是表空間文件
    表空間文件用來存儲,記錄 , 索引等數據 。

  2. 段分為,數據段(Leaf node segment) ,索引段(Non-leaf node segment),回滾段(Rollback segment),InnoDB是索引組織表,數據段就是B+樹的葉子節點,索引段就是非葉子節點 , 段用來管理Extend(區) 。
    一個段相當于一張表

  3. 區是表空間的單元結構,每個區大小為1M,默認情況下InnoDB存儲引擎頁大小為16k,一個區一共16個連續的頁 。

  4. 頁 , 是InnoDB存儲引擎磁盤管理的最小單元 。
    每個區默認16KB,為了保證頁的連續性,InnoDB存儲引擎每次從磁盤申請4到5個區 。

  5. 行指的是InnoDB存儲的數據
    表結構中倆個隱藏字段
    Trx_id:最后一次操作事務的id
    Roll pointer:指針,指向增刪改之前的數據,可以拿這個找到修改之前的數據 。
架構MySQL5.5版本后,默認使用InoDB存儲引擎 。
它擅長事務處理,具有崩潰恢復性特性!
下圖為InnoDB架構圖,左邊為內存結構,右邊為磁盤結構 。
MYSQL-->InnoDB引擎底層原理

文章插圖
內存結構
MYSQL-->InnoDB引擎底層原理

文章插圖
Buffer Pool(緩沖池)緩沖池是主內存的一個區域,里面可以緩存磁盤上經常操作的真實數據 。
在執行增刪改查操作的時候,先操作緩存池中的數據(如果沒有,從磁盤加載并且緩存)
然后以一定頻率刷新到磁盤,從而減少磁盤IO,加快處理速度
在緩存池中有一塊一塊的 , 這個是頁 。
緩存池以頁為單位,底層采用鏈表數據結構管理Page 。
根據狀態將Page分為三類:
  1. free page :空閑頁,未被使用的頁 。
  2. clean page   :被使用的頁 , 數據沒有被修改過 。
  3. dirty page    :臟頁,被使用的頁,頁中數據和磁盤中數據不一致 。
Change Buffer(更改緩存區)介紹
更改緩存區,主要針對非唯一的二級索引 。
在執行DML語句時 , 如果這些數據頁不在Buffer Poor中,不會直接操作磁盤 , 而是將數據變更在更改緩存區Change Buffer中 。
在未來數據被讀取的時候 , 再將數據合并恢復到Buffer Pool中,再將合并后的數據刷新到磁盤中 。
意義
和聚集索引不同,二級索引是非唯一的!
并且二級索引以相對隨機的順序插入 。
同樣的刪除和更新可能會影響索引樹中不相鄰的二級索引頁,如果每一次都操作磁盤,會造成大量磁盤IO 。
有了ChangeBuffer后,我們可以在緩沖池中進行合并處理減少磁盤IO
Log Buffer(日志緩存區)日志緩存區,用來保存要寫入磁盤中的log日志數據(redo log 、undo log) 。
默認大小16MB,日志緩存區的日志會定期刷新到磁盤中 。如果需要更新、插入、或刪除多行的事務,增加日志緩存區大小可以節約磁盤IO
在系統變量中設置即可
關鍵字:
innodb_log_buffer_size 緩存區大小
【MYSQL-->InnoDB引擎底層原理】innodb_flush_log_at_trx_commit 日志刷新到磁盤的時機
1代表的是日志在每次事務提交時寫入并刷新到磁盤
0代表每秒將日志寫入并刷新到磁盤一次
2代表日志在每次事務提交后寫入,并且每秒刷新到磁盤一次
Adaaptive Hash index(自適應哈希索引)自適應哈希索引,用于優化Buffer Pool數據的查詢 。
InnoDB存儲引擎會監控表上各索引頁的查詢,如果觀察到hash索引可以提高速度,就會建立hash索引 。
這個叫自適應哈希索引
可以在系統變量中查詢是否開啟自適應哈希索引
關鍵字是 adaptive_hash_index
磁盤結構
MYSQL-->InnoDB引擎底層原理

文章插圖
System Tablespace(系統表空間)系統表空間是change Buffer的存放區域 。
關鍵字:innodb_data_file_path
系統表空間存放路徑
File-Per-Table Tablespaces存放每個表的獨立表空間
默認是開啟的-->開啟后代表每一張表都會生成對應的表空間文件 。
xxx.ibd結尾的文件都是表的表空間文件

推薦閱讀