一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - Mysql臟頁flush及收縮表空間原理解析

Mysql臟頁flush及收縮表空間原理解析

2021-02-04 17:38Jimmyhe Mysql

這篇文章主要介紹了Mysql臟頁flush及收縮表空間原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

mysql臟頁

由于wal機制,innodb在更新語句的時候,制作了寫日志這一個磁盤操作,就是redo log,在內存寫完redo log后,就返回給客戶端, 即更新成功。

把內存里的數據寫入磁盤的過程,術語就是flush,在flush之前,實際數據和數據庫中的數據是不一致的,因為在redo log基礎上更新了還未寫入,數據庫是老的,當內存數據頁跟磁盤數據頁內容不一致的時候,稱這個內存頁為臟頁,內存寫入后就一致了,稱為干凈頁,

如果mysql偶爾運行速度很慢,很可能是在刷臟頁。引發數據庫flush的過程

  • redo log滿了,系統停止所有更新操作,將checkpoint向前推進,騰出空間繼續寫。
  • 系統內存不足,需要新的內存頁不夠用,就會淘汰一些數據頁,留給別的數據頁使用,如果淘汰的是臟頁,就會先寫到磁盤。
  • mysql空閑的時候。
  • 正常關閉mysql的時候
  • 在第一種情況下,redo log滿了,這種情況是innodb要避免的,因為整個系統都不能再更新了,這是不能接受的
  • 第二種情況,內存滿了,要先寫到磁盤,innodb用緩沖池管理內存,有三種狀態
  • 還沒有用的內存頁
  • 用了并且是干凈頁
  • 用了并且是臟頁(淘汰的時候需要寫入到磁盤)

所以我們有時使用數據庫會發現數據庫性能突然下降,可能就是在處理臟頁。

刷臟頁控制策略

  • innodb_io_capacity參數,這個參數會告訴innodb你的磁盤io能力。(有公式計算)
  • innodb刷盤主要兩個因素:臟頁比例和redo log的寫盤速度
  • innodb_max_derty_pages_pct是臟頁比例上限,默認是75%,調整好innodb_io_capacity參數值,使臟頁比例不要超過75%收縮表空間

場景例子:數據庫占用空間太大,把最大的表刪掉了一半數據,表的大小還是沒有變化。

數據刪除流程

Mysql臟頁flush及收縮表空間原理解析

加入要刪掉r4,innodb引擎只會把r4這個記錄標記為刪除,如果之后再摻入一個id在300-600之間的記錄時,會復用這個位置,但是磁盤文件的大小并不會縮小。

如果刪掉了一個數據頁上的所有記錄,這個數據頁就可以被復用。

注意:數據頁的復用跟記錄的復用是不同的。

  • 比如r4這條記錄被刪除,如果插入一個id是400的行,直接復用這個空間,但是如果插入id是800的行,就不能復用這個位置了。
  • 但是整個數據頁page a上的所有記錄刪除之后,pagea標記為可復用,如果插入一條id=50的記錄需要用新的數據頁的時候,pagea是可以背負用的。
  • 如果我們用delete命令把整個表數據刪除,結果是所有的數據頁都會標記為可復用,但是在磁盤上,文件不會變小。

插入數據流程

如果數據按照索引順序插入的,索引是緊湊的,但是如果是隨機插入的,就會造成索引的數據頁分頁。

Mysql臟頁flush及收縮表空間原理解析

如果pagea已經滿了,在插入一行數據會怎樣?由于a滿了,在插入一個id是550的數據時,就會申請一個新的頁面pageb來保存數據,分裂完成后pagea的末尾就留下了空洞。

更新索引上的值也是刪除一個舊的值,再插入一個新值,也會造成空洞。

收縮空間

新建一個與表a相同結構的表b,按照主鍵id遞增的順序,把數據一行一行的從a里讀出來再插入到表b中,表b中無空洞,數據頁的利用率也更高,如果我們把表b作為臨時表,數據從表a導入到b中的操作完成后,用b替換a,從效果上也起到了收縮a的作用。

Mysql臟頁flush及收縮表空間原理解析

在整個ddl過程中,表a不能有更新,所以這個ddl不是online的,在5.6之后的版本中,流程做了更改:

建立一個臨時文件,掃描a中的所有數據頁,

用數據頁中a的記錄生成b+樹,存儲在臨時文件中

將所有對a的操作記錄在一個日志文件中

臨時文件生成后,將日志文件的操作應用到臨時文件,得到一個邏輯數據上與表a相同的數據文件

用臨時文件替換表a的數據文件

圖示

Mysql臟頁flush及收縮表空間原理解析

可以看到,與圖3過程的不同之處在于,由于日志文件記錄和重放操作這個功能的存在,這個方案在重建表的過程中,允許對表a做增刪改操作。

使用alter table a engine=innodb命令來重建表。在mysql 5.5版本之前,這個命令的執行流程跟我們前面描述的差不多,區別只是這個臨時表b不需要你自己創建,mysql會自動完成轉存數據、交換表名、刪除舊表的操作。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/jimmyhe/p/11072355.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 关晓彤被调教出奶水的视频 | 久久国产视频网站 | 草草精品视频 | 亚洲国产精品久久精品怡红院 | 拔插拔插8x8x海外华人免费视频 | 国产一区二区三区久久小说 | 小小水蜜桃免费影院 | 美女被视频网站看免费入口 | 国产免费又粗又猛又爽视频国产 | 国色天香 社区视频 | 久久强奷乱码老熟女 | 91sao国产在线观看 | 视频免费在线 | 99re这里只有精品视频 | 把女的下面扒开添视频 | xxxx俄罗斯大白屁股 | 国产亚洲福利精品一区 | 日本在线观看www鲁啊鲁视频 | 免费精品视频在线 | 男人猛激烈吃奶gif动态图 | 日本精品一区二区在线播放 | 大肥臀风间由美 中文字幕 大东北chinesexxxx露脸 | 狠狠色狠狠色综合系列 | 四虎永久在线精品波多野结衣 | 天天做天天玩天天爽天天 | 日本www视频在线观看 | 国产精品久久久久一区二区三区 | 免费一级日本c片完整版 | 无码人妻少妇色欲AV一区二区 | 亚洲第6页| 亚洲 欧美 另类 中文 在线 | 调教校花浣肠开菊 | 高清在线观看mv的网址免费 | 精品麻豆 | 日韩在线 在线播放 | 99小视频| 精品久久久久久久国产潘金莲 | 亚洲高清无码在线 视频 | 亚洲不卡视频在线 | 婷婷色网 | 青青草成人在线 |