成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

寫緩沖(change buffer),這次徹底懂了?。。?/h1>

開發 開發工具 前端
上篇《緩沖池(buffer pool),徹底懂了!》介紹了InnoDB緩沖池的工作原理。毫無疑問,對于讀請求,緩沖池能夠減少磁盤IO,提升性能。問題來了,那寫請求呢?

上篇《緩沖池(buffer pool),徹底懂了!》介紹了InnoDB緩沖池的工作原理。

簡單回顧一下:

  • MySQL數據存儲包含內存與磁盤兩個部分;
  • 內存緩沖池(buffer pool)以頁為單位,緩存最熱的數據頁(data page)與索引頁(index page);
  • InnoDB以變種LRU算法管理緩沖池,并能夠解決“預讀失效”與“緩沖池污染”的問題;

畫外音:細節詳見《緩沖池(buffer pool),徹底懂了!》。

毫無疑問,對于讀請求,緩沖池能夠減少磁盤IO,提升性能。問題來了,那寫請求呢?

情況一

假如要修改頁號為4的索引頁,而這個頁正好在緩沖池內。

如上圖序號1-2:

  • 直接修改緩沖池中的頁,一次內存操作;
  • 寫入redo log,一次磁盤順序寫操作;

這樣的效率是***的。

畫外音:像寫日志這種順序寫,每秒幾萬次沒問題。

是否會出現一致性問題呢?

并不會。

  • 讀取,會***緩沖池的頁;
  • 緩沖池LRU數據淘汰,會將“臟頁”刷回磁盤;
  • 數據庫異常奔潰,能夠從redo log中恢復數據;

什么時候緩沖池中的頁,會刷到磁盤上呢?

定期刷磁盤,而不是每次刷磁盤,能夠降低磁盤IO,提升MySQL的性能。

畫外音:批量寫,是常見的優化手段。

情況二

假如要修改頁號為40的索引頁,而這個頁正好不在緩沖池內。

此時麻煩一點,如上圖需要1-3:

  • 先把需要為40的索引頁,從磁盤加載到緩沖池,一次磁盤隨機讀操作;
  • 修改緩沖池中的頁,一次內存操作;
  • 寫入redo log,一次磁盤順序寫操作;

沒有***緩沖池的時候,至少產生一次磁盤IO,對于寫多讀少的業務場景,是否還有優化的空間呢?

這即是InnoDB考慮的問題,又是本文將要討論的寫緩沖(change buffer)。

畫外音:從名字容易看出,寫緩沖是降低磁盤IO,提升數據庫寫性能的一種機制。

什么是InnoDB的寫緩沖?

在MySQL5.5之前,叫插入緩沖(insert buffer),只針對insert做了優化;現在對delete和update也有效,叫做寫緩沖(change buffer)。

它是一種應用在非唯一普通索引頁(non-unique secondary index page)不在緩沖池中,對頁進行了寫操作,并不會立刻將磁盤頁加載到緩沖池,而僅僅記錄緩沖變更(buffer changes),等未來數據被讀取時,再將數據合并(merge)恢復到緩沖池中的技術。寫緩沖的目的是降低寫操作的磁盤IO,提升數據庫性能。

畫外音:R了狗了,這個句子,好長。

InnoDB加入寫緩沖優化,上文“情況二”流程會有什么變化?

假如要修改頁號為40的索引頁,而這個頁正好不在緩沖池內。

加入寫緩沖優化后,流程優化為:

  • 在寫緩沖中記錄這個操作,一次內存操作;
  • 寫入redo log,一次磁盤順序寫操作;

其性能與,這個索引頁在緩沖池中,相近。

畫外音:可以看到,40這一頁,并沒有加載到緩沖池中。

是否會出現一致性問題呢?

也不會。

  • 數據庫異常奔潰,能夠從redo log中恢復數據;
  • 寫緩沖不只是一個內存結構,它也會被定期刷盤到寫緩沖系統表空間;
  • 數據讀取時,有另外的流程,將數據合并到緩沖池;

不妨設,稍后的一個時間,有請求查詢索引頁40的數據。

此時的流程如序號1-3:

  • 載入索引頁,緩沖池未***,這次磁盤IO不可避免;
  • 從寫緩沖讀取相關信息;
  • 恢復索引頁,放到緩沖池LRU里;

畫外音:可以看到,40這一頁,在真正被讀取時,才會被加載到緩沖池中。

還有一個遺漏問題,為什么寫緩沖優化,僅適用于非唯一普通索引頁呢?

InnoDB里,聚集索引(clustered index)和普通索引(secondary index)的異同,《1分鐘了解MyISAM與InnoDB的索引差異》有詳盡的敘述,不再展開。

如果索引設置了唯一(unique)屬性,在進行修改操作時,InnoDB必須進行唯一性檢查。也就是說,索引頁即使不在緩沖池,磁盤上的頁讀取無法避免(否則怎么校驗是否唯一?),此時就應該直接把相應的頁放入緩沖池再進行修改,而不應該再整寫緩沖這個幺蛾子。

除了數據頁被訪問,還有哪些場景會觸發刷寫緩沖中的數據呢?

還有這么幾種情況,會刷寫緩沖中的數據:

  • 有一個后臺線程,會認為數據庫空閑時;
  • 數據庫緩沖池不夠用時;
  • 數據庫正常關閉時;
  • redo log寫滿時;

畫外音:幾乎不會出現redo log寫滿,此時整個數據庫處于無法寫入的不可用狀態。

什么業務場景,適合開啟InnoDB的寫緩沖機制?

先說什么時候不適合,如上文分析,當:

  • 數據庫都是唯一索引;
  • 或者,寫入一個數據后,會立刻讀取它;

這兩類場景,在寫操作進行時(進行后),本來就要進行進行頁讀取,本來相應頁面就要入緩沖池,此時寫緩存反倒成了負擔,增加了復雜度。

什么時候適合使用寫緩沖,如果:

  • 數據庫大部分是非唯一索引;
  • 業務是寫多讀少,或者不是寫后立刻讀取;

可以使用寫緩沖,將原本每次寫入都需要進行磁盤IO的SQL,優化定期批量寫磁盤。

畫外音:例如,賬單流水業務。

上述原理,對應InnoDB里哪些參數?

有兩個比較重要的參數。

  • 參數:innodb_change_buffer_max_size
  • 介紹:配置寫緩沖的大小,占整個緩沖池的比例,默認值是25%,***值是50%。

畫外音:寫多讀少的業務,才需要調大這個值,讀多寫少的業務,25%其實也多了。

  • 參數:innodb_change_buffering
  • 介紹:配置哪些寫操作啟用寫緩沖,可以設置成all/none/inserts/deletes等。

希望大家有收獲,思路比結論重要。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-06-24 05:05:40

緩沖池查詢數據InnoDB

2022-03-30 09:23:15

MySQL緩沖

2019-06-26 09:41:44

分布式事務微服務

2022-03-22 15:05:15

MySQL緩沖池

2020-07-08 08:07:23

高并發系統消息隊列

2022-04-25 09:03:16

JavaScript代碼

2025-03-17 00:21:00

2023-12-11 11:29:35

2022-03-26 08:49:13

MySQL數據存儲

2024-06-21 08:32:24

2021-04-28 09:27:56

MySQLInnoDB數據庫

2021-08-31 10:25:55

性能Change Buff索引

2022-06-07 08:14:35

PGPAGETUPLE

2025-04-08 08:20:00

2020-08-10 07:52:30

MySQL數據庫

2025-02-20 10:04:35

2020-10-26 07:02:11

ConcurrentH存儲

2020-09-29 06:44:28

Redis延時隊列

2020-07-02 09:15:59

Netty內存RPC

2020-10-23 10:10:59

Promise前端代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷色国产偷v国产偷v小说 | 日本精品一区二区三区视频 | 激情一区二区三区 | 国产大片一区 | 久久精品| 91精品国产91久久综合桃花 | 久久久影院 | 国精产品一区一区三区免费完 | 日韩视频中文字幕 | 精品久久久久久中文字幕 | 91精品久久久久久久久中文字幕 | 一区二区三区视频在线观看 | 国产一区在线免费观看 | 亚洲天堂999 | 亚洲欧洲精品一区 | 国产成人免费视频 | 久久国产精品免费一区二区三区 | 国产日韩欧美中文 | 亚洲在线免费观看 | 成人影院一区二区三区 | 国产精品影视在线观看 | 91视频网| 亚州av在线| 精品一区二区三区四区在线 | 成人区精品 | 日韩福利在线观看 | 一区二区三区精品在线视频 | 精品一区二区三区在线观看国产 | 91久久精品国产 | 久久91精品国产一区二区三区 | 日韩av在线中文字幕 | 香蕉婷婷 | 国产精品久久久久一区二区三区 | 精品一区国产 | 最新日韩在线视频 | 亚洲国产成人精品女人 | 日韩一区二区成人 | 久久久久久国产精品 | 二区中文| 99久久精品国产毛片 | 亚洲日本欧美日韩高观看 |