1. 程式人生 > >理解mysql_事務原理及常見優化思路

理解mysql_事務原理及常見優化思路

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位置等資訊