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