MySQLGroupCommit的優化
最近花了一些時間在做MySQL Group Commit的優化,關於Group commit的原理,這裡不再贅述,有興趣的可以翻閱我之前的部落格http://mysqllover.com/?p=581,這裡簡單描述下兩點優化,主要基於MySQL5.6.16
1.優化binlog_order_commits=0並且sync_binlog>0時的效能
我們知道當binlog_order_commits關閉時,表示我們能接受binlog commit和innodb commit的順序不同(這不會帶來資料不一致,但可能會影響到熱備份),關閉該選項可以帶來一定程度的效能提升。
本優化也是基於該前提,假定sync_binlog =1000, 那麼在第1000組事務進入sync stage時,需要去做binlog sync,我們知道fsync操作是非常慢且耗時的操作,而第1001組事務,顯然無需去做sync,如果我們允許innodb/binlog commit失序,就可以讓第1001組事務跳過sync stage,直接進入innodb commit
detail見http://bugs.mysql.com/bug.php?id=73018,附加補丁
2.延遲寫redo直到group commit時來提升效能
我們知道MySQL使用Binlog,Innodb XA的方式來進行crash recovery,所有記錄在binlog中的事務我們都期望能夠commit掉;
這意味著,在寫binlog之前,需要確保事務的prepare狀態被寫到redo中,這樣才能從crash中恢復.
原生的邏輯中,各個事務各自做innodb prepare, 並寫redo log; 只有到了commit階段,進入ordered_commit,才進入組提交;
我們主要集中在group commit的第一階段:flush stage。 在該階段,leader執行緒從佇列中pop 執行緒加入queue,並依次flush thread cache到binlog檔案.
修改後的流程:
1. 在Innodb prepare階段不再write/sync redo log,而是直接返回
2.在group commit的flush stage階段,修改成如下邏輯
a) 收集組提交佇列
b) 呼叫ha_flush_logs 做一次redo write/sync
c) 將佇列中thd的所有binlog cache寫到binlog檔案中
detail見http://bugs.mysql.com/bug.php?id=73202, 附加補丁
相關文章
- MySQL優化(1)——–常用的優化步驟MySql優化
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- hive的優化Hive優化
- web的優化Web優化
- mysql的優化MySql優化
- Cacti的優化優化
- 效能優化案例-SQL優化優化SQL
- MSSQL優化之索引優化SQL優化索引
- CUDA優化之指令優化優化
- 數值最優化—優化問題的解(二)優化
- seo優化中不容忽視的頁面優化優化
- 【SQL優化】SQL優化的10點注意事項SQL優化
- Flutter的效能優化Flutter優化
- java Synchronized的優化Javasynchronized優化
- Hive --------- hive 的優化Hive優化
- nginx的location優化Nginx優化
- Oracle優化的方法Oracle優化
- mysql的sql優化MySql優化
- ansible的優化優化
- Oracle 索引的優化Oracle索引優化
- oracle 的優化器Oracle優化
- 優化你的CSS優化CSS
- CCSpriteBatchNode的優化效能BAT優化
- draw call 的優化優化
- Oracle的優化器Oracle優化
- 優化SQL中的or優化SQL
- Like 的優化 (zt)優化
- Android效能優化——效能優化的難題總結Android優化
- 前端效能優化(三)——傳統 JavaScript 優化的誤區前端優化JavaScript
- 效能優化漫談之七:效能優化的誤區優化
- Android效能優化之被忽視的優化點Android優化
- Oracle資料的優化器有兩種優化方法:Oracle優化
- Android效能優化----卡頓優化Android優化
- 資料庫優化 - SQL優化資料庫優化SQL
- 【前端效能優化】vue效能優化前端優化Vue
- 前端效能優化 --- 圖片優化前端優化
- sql優化之邏輯優化SQL優化
- [效能優化]DateFormatter深度優化探索優化ORM