最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

mysql臟頁

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

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

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

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

所以我們有時使用數(shù)據(jù)庫會發(fā)現(xiàn)數(shù)據(jù)庫性能突然下降,可能就是在處理臟頁。

刷臟頁控制策略

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

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

數(shù)據(jù)刪除流程

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

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

注意:數(shù)據(jù)頁的復用跟記錄的復用是不同的。

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

插入數(shù)據(jù)流程

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

如果pageA已經(jīng)滿了,在插入一行數(shù)據(jù)會怎樣?由于A滿了,在插入一個id是550的數(shù)據(jù)時,就會申請一個新的頁面pageB來保存數(shù)據(jù),分裂完成后pageA的末尾就留下了空洞。

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

收縮空間

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

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

建立一個臨時文件,掃描A中的所有數(shù)據(jù)頁,

用數(shù)據(jù)頁中A的記錄生成B+樹,存儲在臨時文件中

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

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

用臨時文件替換表A的數(shù)據(jù)文件

圖示

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

使用alter table A engine=InnoDB命令來重建表。在MySQL 5.5版本之前,這個命令的執(zhí)行流程跟我們前面描述的差不多,區(qū)別只是這個臨時表B不需要你自己創(chuàng)建,MySQL會自動完成轉存數(shù)據(jù)、交換表名、刪除舊表的操作。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 解決MySQL報錯Error 3948 (42000): Loading local data is disabled問題

    解決MySQL報錯Error 3948 (42000): Loading loc

    在執(zhí)行MySQL項目過程中意外出現(xiàn)的報錯,之前也沒有遇到過,報錯信息如下,Error 3948 (42000): Loading local data is disabled; this must be enabled on both the client an,本文小編就給大家介紹一下解決報錯的方法,需要的朋友可以參考下
    2023-09-09
  • Linux?安裝?MySQL?8.0?及?配置方法

    Linux?安裝?MySQL?8.0?及?配置方法

    本文詳細介紹了在Ubuntu操作系統(tǒng)上使用MySQL?APT存儲庫安裝和配置MySQL?8.0的步驟,本文通過圖文示例相結合給大家講解的非常詳細,感興趣的朋友一起看看吧
    2024-11-11
  • 使用mysql語句對分組結果進行再次篩選方式

    使用mysql語句對分組結果進行再次篩選方式

    這篇文章主要介紹了使用mysql語句對分組結果進行再次篩選方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL中的排序規(guī)則

    MySQL中的排序規(guī)則

    這篇文章主要介紹了MySQL中的排序規(guī)則,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 分享MySQL常用?內(nèi)核?Debug?幾種常見方法

    分享MySQL常用?內(nèi)核?Debug?幾種常見方法

    這篇文章主要給大家分享的是MySQL常用的內(nèi)核Debug技巧,掌握?MySQL?內(nèi)核源碼的閱讀和調(diào)試能力,不僅是數(shù)據(jù)庫研發(fā)人員的日常,也是?DBA?進階的必經(jīng)之路,下面一起進入文章了解更多相關內(nèi)容吧
    2022-03-03
  • MySQL查詢條件常見用法詳解

    MySQL查詢條件常見用法詳解

    這篇文章主要介紹了MySQL查詢條件常見用法,結合實例形式總結分析了MySQL常見的各類查詢條件與簡單使用方法,需要的朋友可以參考下
    2019-11-11
  • MySQL union 語法代碼示例分析

    MySQL union 語法代碼示例分析

    主要介紹的是MySQLunion 語法代碼演示,我前兩天在相關網(wǎng)站看見MySQLunion 語法代碼演示的資料,覺得挺好,就拿出來供大家分享。希望在你今后的學習中會對你有所幫助。
    2010-06-06
  • sql中select into和insert select的用法小結

    sql中select into和insert select的用法小結

    在工作中,我們經(jīng)常需要備份表,本文主要介紹了sql中select into和insert select的用法小結,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • mysql查詢語句中用戶變量的使用代碼解析

    mysql查詢語句中用戶變量的使用代碼解析

    這篇文章主要介紹了mysql查詢語句中用戶變量的使用代碼解析,涉及部分代碼優(yōu)化的內(nèi)容,通過示例向大家解析用戶變量的相關問題,需要的朋友可以參考下。
    2017-10-10
  • MySQL 使用自定義變量進行查詢優(yōu)化

    MySQL 使用自定義變量進行查詢優(yōu)化

    MySQL自定義變量估計很少人有用到,但是如果用好了也是可以輔助進行性能優(yōu)化的。需要注意的是變量是基于連接會話的,而且可能存在一些意外的情況,需要小心使用。本篇介紹如何利用自定義變量進行查詢優(yōu)化,提高效率
    2021-05-05

最新評論

顺平县| 安阳市| 贺州市| 绥化市| 青岛市| 从化市| 凯里市| 河池市| 来安县| 灌云县| 扎赉特旗| 柳河县| 抚宁县| 丁青县| 冕宁县| 偃师市| 出国| 柞水县| 锦屏县| 罗山县| 永清县| 通江县| 汶上县| 靖边县| 东乌| 公主岭市| 巨野县| 萨嘎县| 咸宁市| 阿拉善左旗| 阿城市| 越西县| 如东县| 墨竹工卡县| 五华县| 房产| 恩施市| 蒲城县| 集贤县| 六枝特区| 宁国市|