理解mysql_事務原理及常見優化思路
阿新 • • 發佈:2019-02-10
WAL機制, 先採用日誌的方式將操作記錄下來,然後重新整理磁碟。
InnoDB遵循WAL協議,在日誌持久化到磁碟之後,才會將日誌對應的髒頁刷 回磁碟;
InnoDB記憶體中,DML操作順序如下:
– 寫Undo(獲取ROLLBACK_PTR系統列)
– 修改Page
– 寫Redo的順序
不同的Update語句,寫的日誌量有較大差異(三種Update Case);
– In Place Update日誌量最小,操作最簡單;
– 不修改主鍵列,日誌量其次;
– 修改主鍵列,日誌量最大,操作最複雜;
日誌檔案:
redo:保證事務的永續性
順序寫,基本上不用讀操作,只有在異常down機後才會讀進行資料恢復操作。
何時寫: 事務提交時
當log buffer中有一半的記憶體空間已經被使用時
log checkpoint時
例項shutdown時
binlog切換時
undo:
保證事務的原子性
事務回滾及mvcc控制
隨機讀寫。
每執行一次事務,都需要做一次fsync操作,因此磁碟的效能影響fsync的效能, fsync效能也就影響到資料庫的效能。 資料庫可以通過引數來控制,提交事務時不寫日誌,而是由非同步操作來刷日誌,但是異常時會丟一個週期內的事務資料。
innodb_flush_log_at_trx_commit引數設定 0\1\2
預設 1
1 : 每commit一次呼叫一次fsync寫日誌,寫資料檔案
0: 非同步控制,mysql執行緒每隔1秒非同步執行fsync, db crash 會有1秒的資料丟失
2: 非同步控制,寫入作業系統快取,不進行fsync,由作業系統進行排程fsync,作業系統crash會有資料丟失。
二進位制日誌與重做日誌的區別:
1、二進位制日誌所有儲存引擎都有的,而重做日誌只有innodb才有
2、二進位制日誌是邏輯日誌,裡面記錄了sql語句,而重做日誌是物理日誌,記錄的是每個頁的修改page位置等資訊
InnoDB遵循WAL協議,在日誌持久化到磁碟之後,才會將日誌對應的髒頁刷 回磁碟;
InnoDB記憶體中,DML操作順序如下:
– 寫Undo(獲取ROLLBACK_PTR系統列)
– 修改Page
– 寫Redo的順序
不同的Update語句,寫的日誌量有較大差異(三種Update Case);
– In Place Update日誌量最小,操作最簡單;
– 不修改主鍵列,日誌量其次;
– 修改主鍵列,日誌量最大,操作最複雜;
日誌檔案:
redo:保證事務的永續性
順序寫,基本上不用讀操作,只有在異常down機後才會讀進行資料恢復操作。
何時寫: 事務提交時
當log buffer中有一半的記憶體空間已經被使用時
log checkpoint時
例項shutdown時
binlog切換時
undo:
保證事務的原子性
事務回滾及mvcc控制
隨機讀寫。
每執行一次事務,都需要做一次fsync操作,因此磁碟的效能影響fsync的效能, fsync效能也就影響到資料庫的效能。 資料庫可以通過引數來控制,提交事務時不寫日誌,而是由非同步操作來刷日誌,但是異常時會丟一個週期內的事務資料。
innodb_flush_log_at_trx_commit引數設定 0\1\2
預設 1
1 : 每commit一次呼叫一次fsync寫日誌,寫資料檔案
0: 非同步控制,mysql執行緒每隔1秒非同步執行fsync, db crash 會有1秒的資料丟失
2: 非同步控制,寫入作業系統快取,不進行fsync,由作業系統進行排程fsync,作業系統crash會有資料丟失。
二進位制日誌與重做日誌的區別:
1、二進位制日誌所有儲存引擎都有的,而重做日誌只有innodb才有
2、二進位制日誌是邏輯日誌,裡面記錄了sql語句,而重做日誌是物理日誌,記錄的是每個頁的修改page位置等資訊