日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

写入mysql_MySQL写入缓冲区在数据库中的作用( Change Buffer )

發布時間:2025/4/5 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 写入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 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。