写入mysql_MySQL写入缓冲区在数据库中的作用( Change Buffer )
介紹另外一種重要的數據變更日志,也就是InnoDB change buffer。Change buffer的主要目的是將對二級索引的數據操作緩存下來,以此減少二級索引的隨機IO,并達到操作合并的效果。
?本期我們介紹另外一種重要的數據變更日志,也就是InnoDB change buffer。Change buffer的主要目的是將對二級索引的數據操作緩存下來,以此減少二級索引的隨機IO,并達到操作合并的效果。?內存緩沖池(buffer pool)以頁為單位,緩存最熱的數據頁(data page)與索引頁(index page);?InnoDB以變種LRU算法管理緩沖池,并能夠解決“預讀失效”與“緩沖池污染”的問題;?毫無疑問,對于讀請求,緩沖池能夠減少磁盤IO,提升性能。問題來了,那寫請求呢?
Mysql寫入數據原理-無 Change Buffer
示例一
假如要修改頁號為4的索引頁,而這個頁正好在緩沖池內。
1.直接修改緩沖池的數據頁,一次內存操作。2.寫入redo log日志數據變化,一次磁盤順序寫操作。
PS:1. 像寫redo log日志這種順序IO寫操作,每秒幾萬次都沒有什么問題!什么時候緩沖池中的頁,會刷到磁盤上呢 ?定期刷磁盤,而不是每次刷磁盤,能夠降低磁盤IO,提升MySQL的性能。
示例二
假如要修改頁號為40的索引頁,而這個頁正好不在緩沖池內。
1.先把數據頁號為40的索引頁,從磁盤加載到緩沖池中,一次磁盤隨機讀操作。2.修改內存緩沖池的數據頁,一次內存操作。3.寫入redo log日志數據變換,一次磁盤順序寫操作。
Mysql寫入數據原理-有 Change Buffer
?沒有命中緩沖池的時候,至少產生一次磁盤IO,對于寫多讀少的業務場景,是否還有優化的空間呢??下面介紹Change Buffer,從名字容易看出,寫緩沖是降低磁盤IO,提升數據庫寫性能的一種機制。
什么是InnoDB的寫緩沖?
在MySQL5.5之前,叫插入緩沖(insert buffer),只針對insert做了優化;現在對delete和update也有效,叫做寫緩沖(change buffer)。它是一種應用在非唯一普通索引頁(non-unique secondary index page)不在緩沖池中,對頁進行了寫操作,并不會立刻將磁盤頁加載到緩沖池,而僅僅記錄緩沖變更(buffer changes),等未來數據被讀取時,再將數據合并(merge)恢復到緩沖池中的技術。寫緩沖的目的是降低寫操作的磁盤IO,提升數據庫性能。
示例三
?InnoDB加入寫緩沖優化,上文“示例二”流程會有什么變化??假如要修改頁號為40的索引頁,而這個頁正好不在緩沖池內。
1.在寫緩沖區( Change Buffer )中記錄這個操作,一次內存操作。2.寫入redo log日志數據變化,一次磁盤順序寫操作。
PS:可以看到,數據頁號為40這一頁,并沒有加載到緩沖池中。此時如果MySQL Crash,可以從redo log日志恢復數據。寫緩沖區( Change Buffer )不是一個內存結構,它也會被定期執行刷新操作,寫入緩沖系統表空間。
示例四
?數據讀取時,有另外的流程,將數據合并到緩沖池;?基于示例三后的一個短時間內,有請求查詢索引頁40的數據。
1.加載數據頁號為40的索引頁到緩沖池中,緩沖池未命中,這次磁盤IO無法避免。2.然后從緩沖池中讀取數據頁號為40的數據信息。3.將數據頁號為40的索引頁,放到緩沖池LRU內( LRU算法管理緩沖池 )
PS:可以看到,40這一頁,在真正被讀取時,才會被加載到緩沖池中。
為什么寫緩沖優化,僅適用于非唯一普通索引頁呢?
如果索引設置了唯一(unique)屬性,在進行修改操作時,InnoDB必須進行唯一性檢查。也就是說,索引頁即使在緩沖池,磁盤上的數據頁讀取無法避免(否則怎么校驗是否唯一?),此時就應該直接把相應的頁放入緩沖池再進行修改,而不應該再搞寫緩沖池這個東東。
哪些場景會觸發刷寫緩沖中的數據呢?
?有一個后臺線程,認為數據庫空閑時;?數據庫緩沖池不夠用時;?數據庫正常關閉時;?redo log寫滿時;
PS:redo log一般不會被寫滿的,如果整個數據庫處于無法寫入和不可用的狀態。
什么業務場景,適合開啟InnoDB的寫緩沖機制?
適合場景
?數據庫大部分是非唯一索引。?業務是寫多讀少,不是寫入數據后要立刻讀取的。
PS:將原本每次寫入都需要進行磁盤IO的SQL,優化定期批量寫磁盤。場景:例如賬單流水業務、用戶行為記錄
不適合場景
?數據庫大部分是唯一索引。?寫入一個數據后,會立刻讀取它。
PS:如果寫入數據后立刻要讀取,反而寫緩存反倒成了負擔,增加了復雜度。場景:銀行卡余額
對應InnoDB里哪些參數?
root@localhost:mysql.sock 16:09:59[(none)]> show variables like 'innodb_change%';+-------------------------------+-------+| Variable_name | Value |+-------------------------------+-------+| innodb_change_buffer_max_size | 25 || innodb_change_buffering | all |+-------------------------------+-------+2 rows in set (0.01 sec)?innodb_change_buffer_max_size 配置寫緩沖的大小,占整個緩沖池的比例,默認值是25%,最大值是50%。?innodb_change_buffering 配置哪些寫操作啟用寫緩沖,可以設置成all/none/inserts/deletes等。
原創作者:老A
原創地址:https://dbawsp.com/1878.html
總結
以上是生活随笔為你收集整理的写入mysql_MySQL写入缓冲区在数据库中的作用( Change Buffer )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果11怎么关掉横屏_苹果手机这些常规操
- 下一篇: linux安装mysql5.7.18_L