电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

MySQL刪除數據,表文件大小依然沒變的原因

瀏覽:6日期:2023-10-10 16:24:26

對于運行很長時間的數據庫來說,往往會出現表占用存儲空間過大的問題,可是將許多沒用的表刪除之后,表文件的大小并沒有改變,想解決這個問題,就需要了解 InnoDB 如何回收表空間的。

對于一張表來說,占用空間重要分為兩部分,表結構和表數據。通常來說,表結構定義占用的空間很小。所以空間的問題主要和表數據有關。

在 MySQL 8.0 前,表結構存儲在以 .frm 為后綴的文件里。在 8.0,允許將表結構定義在系統數據表中。

關于表數據的存放

可以將表數據存在共享表空間,或者單獨的文件中,通過 innodb_file_per_table 來控制。

如果為 OFF ,表示存在系統共享表空間中,和數據字典一起 如果為 ON,每個 InnoDB 表結構存儲在 .idb 為后綴的文件中

在 5.6.6 以后,默認值為 ON.

建議將該參數設置為 ON,這樣在不需要時,通過 drop table 命令,系統就會直接刪除該文件。

但在共享表空間中,即使表刪掉,空間也不會回收。

truncate = drop + create

數據刪除流程

但有時使用 delete刪除數據時,僅僅刪除的是某些行,但這可能就會出現表空間沒有被回收的情況。

我們知道,MySQL InnoDB 中采用了 B+ 樹作為存儲數據的結構,也就是常說的索引組織表,并且數據時按照頁來存儲的。

在刪除數據時,會有兩種情況:

刪除數據頁中的某些記錄 刪除整個數據頁的內容

比如想要刪除 R4 這條記錄:

MySQL刪除數據,表文件大小依然沒變的原因

InnoDB 直接將 R4 這條記錄標記為刪除,稱為可復用的位置。如果之后要插入 ID 在 300 到 700 間的記錄時,就會復用該位置。由此可見,磁盤文件的大小并不會減少。

而且記錄的復用,只限于符合范圍條件的數據。之后要插入 ID 為 800 的記錄,R4 的位置就不能被復用了。

再比如要是刪除了整個數據頁的內容,假設刪除 R3 R4 R5,為 Page A 數據頁。

這時 InnoDB 就會將整個 Page A 標記為刪除狀態,之后整個數據都可以被復用,沒有范圍的限制。比如要插入 ID=50 的內容就可以直接復用。

并且如果兩個相鄰的數據頁利用率都很小,就會把兩個頁中的數據合到其中一個頁上,另一個頁標記為可復用。

綜上,無論是數據行的刪除還是數據頁的刪除,都是將其標記為刪除的狀態,用于復用,所以文件并不會減小。對應到具體的操作就是使用 delete 命令.

而且,我們還可以發現,對于第一種刪除記錄的情況,由于復用時會有范圍的限制,所以就會出現很多空隙的情況,比如刪除 R4,插入的卻是 ID=800.

插入操作也會造成空隙

在插入數據時,如果數據按照索引遞增順序插入,索引的結構會是緊湊的。但如果是隨機插入的,很可能造成索引數據頁分裂。

比如給已滿的 Page A 插入數據。

MySQL刪除數據,表文件大小依然沒變的原因

由于 Page A 滿了,所以要申請 Page B,調整 Page A 的過程到 Page B,這也稱為頁分裂。

結束后 Page A 就有了空隙。

另外對于更新操作也是,先刪除再插入,也會造成空隙。

進而對于大量進行增刪改的表,都有可能存在空洞。如果把空洞去掉,自然空間就被釋放了。

使用重建表

為了把表中的空隙去掉,這時就可以采用重新建一個與表 A 結構相同的表 B,然后按照主鍵 ID 遞增的順序,把數據依次插入到 B 表中。

由于是順序插入,自然 B 表的空隙不存在,數據頁的利用率也更高。之后用表 B 代替表 A,好像起到了收縮表 A 空間的作用。

具體通過:

alter table A engine=InnoDB

在 5.5 版本后,該命令和上面提到的流程差不多,而且 MySQL 會自己完成數據,交換表名,刪除舊表的操作。

MySQL刪除數據,表文件大小依然沒變的原因

但這就有一個問題,在 DDL 中,表 A 不能有更新,此時有數據寫入表 A 的話,就會造成數據丟失。

在 5.6 版本后引入了 Online DDL。

Online DDL

Online DDL 在其基礎上做了如下的更新:

MySQL刪除數據,表文件大小依然沒變的原因

重建表的過程如下:

建立一個臨時文件,掃描表 A 主鍵的所有數據頁。 用生成的數據頁生成 B+ 樹,存儲到臨時文件中。 生成臨時文件時,如果有對 A 的操作,將其記錄在日志文件中,對應圖中 state 2 的狀態。 臨時文件生成后,將日志文件應用到臨時文件中,得到與 A 表相同的數據文件,對應 state 3 狀態。 用臨時文件替換 A 表的數據文件。

由于 row log 日志文件存在,可以在重建表示,對表 A 進行 DML 操作。

需要注意的是,在 alter 語句執行前,會先申請 MDL 寫鎖,但在拷貝數據前會退化成 MDL 讀鎖,從而支持 DML 操作。

至于為什么不大 MDL 去掉,是防止其他線程對這個表同時做 DDL 操作。

對于大表來說,該操作很耗 IO 和 CPU 資源,所以在線上操作時,要控制操作時間。如果為了保證安全,推薦使用 gh-ost 來遷移。

Online 和 inplace

首先說一下 inplace 和 copy 的區別:

在 Online DDL 中,表 A 重建后的數據放在 tmp_file 中,這個臨時文件是在 InnoDB 內部創建出來的。整個 DDL 在 InnoDB 內部完成。進而對于 Server 層來說,并沒有數據移動到臨時表中,是一個 '原地' 操作,所以叫 'inplace' .

而在之前普通的 DDL 中,創建后的表 A 是在 tmp_table 是 Server 創建的,所以叫 'copy'

對應到語句其實就是:

-- alter table t engine=InnoDB 默認為下面alter table t engine=innodb,ALGORITHM=inplace;-- 走的就是 server 拷貝的過程alter table t engine=innodb,ALGORITHM=copy;

需要注意的是 inplace 和 Online 并不是對應關系:

DDL 過程是 Online,則一定是 inplace 如果是 inplace 的 DDL 不應當是 Online,如在 <= 8.0, 添加全文索引和空間索引就屬于這種情況。

拓展

說一下 optimize,analyze,alter table 三種重建表之間的區別:

alter table t engine = InnoDB(也就是 recreate)默認的是 Oline DDL 過程。 analyze table t 不是重建表,僅僅是對表的索引信息做重新統計,沒有修改數據,期間加 MDL 讀鎖。 optimize table t 等于上兩步的操作。

在事務里面使用 alter table 默認會自動提交事務,保持事務一致性

如果有時,在重建某張表后,空間不僅沒有變小,甚至還變大了一點點。這時因為,重建的這張表本身沒有空隙,在 DDL 期間,剛好有一些 DML 執行,引入了一些新的空隙。

而且 InnoDB 不會把整張表填滿,每個頁留下 1/16 給后續的更新用,所以可能遠離是緊湊的,但重建后變成的稍有空隙。

總結

現在我們知道,在使用 delete 刪除數據時,其實對應的數據行并不是真正的刪除,InnoDB 僅僅是將其標記成可復用的狀態,所以表空間不會變小。

通常來說,在標記復用空間時分為兩種,一種是僅將某些數據頁中的位置標記為刪除狀態,但這樣的位置只會在一定范圍內使用,會出現空隙的情況。

另一種是將整個數據頁標記成可復用的狀態,這樣的數據頁沒有限制,可直接復用。

為了解決這個問題,我們可以采用重建表的方式,其中在 5.6 版本后,創建表已經支持 Online 的操作,但最后是在業務低峰時使用

以上就是MySQL刪除數據,表文件大小依然沒變的原因的詳細內容,更多關于MySQL表文件大小的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 耐热钢-耐磨钢-山东聚金合金钢铸造有限公司 | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 旗帜网络笔记-免费领取《旗帜网络笔记》电子书 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 连续油炸机,全自动油炸机,花生米油炸机-烟台茂源食品机械制造有限公司 | 高博医疗集团上海阿特蒙医院| 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 重庆轻质隔墙板-重庆安吉升科技有限公司| 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 海外仓系统|国际货代系统|退货换标系统|WMS仓储系统|海豚云 | 谷歌关键词优化-外贸网站优化-Google SEO小语种推广-思亿欧外贸快车 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 国产液相色谱仪-超高效液相色谱仪厂家-上海伍丰科学仪器有限公司 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 上海阳光泵业制造有限公司 -【官方网站】 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 |