做者及簡介:
黃 炎,愛可生首席技術官;
王 悅,愛可生研發團隊成員,負責數據庫管理平臺相關項目的開發和故障排查,好奇 MySQL 技術原理及各種數據庫實現方案。
本文來源:轉載自公衆號-圖解 MySQL
*愛可生開源社區出品,原創內容未經受權不得隨意使用,轉載請聯繫小編並註明來源。
一條 insert 語句在寫入磁盤的過程當中到底涉及了哪些文件?順序又是如何的?下面咱們用兩張圖和你們一塊兒解析 insert 語句的磁盤寫入之旅。數據庫
綜上(在 InnoDB buffer pool 足夠大且上述的兩個參數設置爲雙一時),insert 語句成功提交時,真正發生磁盤數據寫入的,並非 MySQL 的數據文件,而是 redo log 和 binlog 文件。然而,InnoDB buffer pool 不可能無限大,redo log 也須要按期輪換,很難容下全部的數據,下面咱們就來看看 buffer pool 與磁盤數據文件的交互方式。緩存
double write 背景
InnoDB buffer pool 一頁髒頁大小爲 16 KB,若是隻寫了前 4KB 時發生宕機,那這個髒頁就發生了寫失敗,會形成數據丟失。爲了不這一問題,InnoDB 使用了 double write 機制(InnoDB 將 double write 的數據存於共享表空間中)。在寫入數據文件以前,先將髒頁寫入 double write 中,固然這裏的寫入都是須要刷盤的。有人會問 redo log 不是也能恢復數據頁嗎?爲何還須要 double write?這是由於 redo log 中記錄的是頁的偏移量,好比在頁偏移量爲 800 的地方寫入數據 xxx,而若是頁自己已經發生損壞,應用 redo log 也無濟於事。安全
insert buffer 背景
InnoDB 的數據是根據彙集索引排列的,一般業務在插入數據時是按照主鍵遞增的,因此插入彙集索引通常是順序磁盤寫入。可是不可能每張表都只有彙集索引,當存在非彙集索引時,對於非彙集索引的變動就可能不是順序的,會拖慢總體的插入性能。爲了解決這一問題,InnoDB 使用了 insert buffer 機制,將對於非彙集索引的變動先放入 insert buffer ,儘可能合併一些數據頁後再寫入實際的非彙集索引中去。性能
有一些狀況下能夠不通過 double write 直接刷盤spa
彙總兩張圖,一條 insert 語句的全部涉及到的數據在磁盤上會依次寫入 redo log,binlog,(double write,insert buffer) 共享表空間,最後在本身的用戶表空間落定爲安。日誌