国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL持久化和回滾該怎么領會

2024-07-24 12:33:40
字體:
來源:轉載
供稿:網友
  這篇文章跟大家分析一下“MySQL持久化和回滾該怎么理解”。內容詳細易懂,對“MySQL持久化和回滾該怎么理解”感興趣的朋友可以跟著小編的思路慢慢深入來閱讀一下,希望閱讀后能夠對大家有所幫助。下面跟著小編一起深入學習“MySQL持久化和回滾該怎么理解”的知識吧。
  
  它的流程大概是這樣的:
 
  先判斷user_id這條數據所在的頁是否在內存里,如果不在的話,先從數據庫讀取到,然后加載到內存中
  修改內存中的age為11
  寫入redo log,并且redo log處于prepare狀態
  寫入binlog
  提交事務,redo log變成commit狀態
  MySQL持久化和回滾該怎么理解
 
  這里面有幾個關鍵的點:redo log是什么?為什么需要redo log?prepare狀態的redo log是什么?redo log和binlog是否可以只選其一...?帶著這一系列的問題,我們來揭開redo log的面紗。
 
  為什么要先更新內存數據,不直接更新磁盤數據?
  我們為什么不每次更新數據的時候,直接更新對應的磁盤數據?首先我們知道磁盤IO是緩慢的,內存是快速的,兩者的速度不是一個量級的,那么針對緩慢的磁盤IO,出現了索引,通過索引哪怕數據成百上千萬我們依然可以在磁盤上很快速的找我們的數據,這就是索引的作用。但是索引也需要維護,并不是一成不變的,當我們插入一條新數據A的時候,由于這條數據要插入在已存在的數據B之后,那么就要移動B數據,讓出一個位置給A,這個有一定的開銷。
 
  更糟糕的是,本來要插入的頁已經滿了,那么就要申請一個新的頁,然后挪一部分數據過去,這叫做頁的分裂,這個開銷更大。如果我們的sql變更是直接修改磁盤的數據,恰巧正好出現上面的問題,那么此時的效率就會很低,嚴重的話會造成超時,這也是上面更新的過程為什么先要加載對應的數據頁到內存中,然后先更新內存中的數據的原因。對于mysql來說,所有的變更都必須先更新緩沖池中的數據,然后緩沖池中的臟頁會以一定的頻率被刷入磁盤(checkPoint機制),通過緩沖池來優化CPU和磁盤之間的鴻溝,這樣就可以保證整體的性能不會下降太快。
 
  為什么需要redo log?
  緩沖池可以幫助我們消除CPU和磁盤之間的鴻溝,checkpoint機制可以保證數據的最終落盤,然而由于checkpoint并不是每次變更的時候就觸發的,而是master線程隔一段時間去處理的。所以最壞的情況就是剛寫完緩沖池,數據庫宕機了,那么這段數據就是丟失的,無法恢復。這樣的話就不滿足ACID中的D,為了解決這種情況下的持久化問題,InnoDB引擎的事務采用了WAL技術(Write-Ahead Logging),這種技術的思想就是先寫日志,再寫磁盤,只有日志寫入成功,才算事務提交成功,這里的日志就是redo log。當發生宕機且數據未刷到磁盤的時候,可以通過redo log來恢復,保證ACID中的D,這就是redo log的作用。
 
  redo log是如何實現的?
  redo log的寫入并不是直接寫入磁盤的,redo log也有緩沖區的,叫做redo log buffer(重做日志緩沖),InnoDB引擎會在寫redo log的時候先寫redo log buffer,然后也是以一定的頻率刷入到真正的redo log中,redo log buffer一般不需要特別大,它只是一個臨時的容器,master線程會每秒將redo log buffer刷到redo log文件中,因此我們只要保證redo log buffer能夠存下1s內的事務變更的數據量即可,以mysql5.7.23為例,這個默認是16M。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彭山县| 会东县| 西安市| 东台市| 通榆县| 贵阳市| 香港 | 双牌县| 藁城市| 清河县| 濮阳县| 三门峡市| 收藏| 广安市| 宜城市| 福鼎市| 长治县| 台江县| 密云县| 东莞市| 高雄市| 吉水县| 阿克苏市| 双牌县| 平阳县| 朝阳市| 出国| 林甸县| 囊谦县| 遂昌县| 上栗县| 甘肃省| 固原市| 杭州市| 灵丘县| 保靖县| 鲜城| 阿瓦提县| 灵台县| 松滋市| 南京市|