當(dāng) MySQL 數(shù)據(jù)庫(kù)服務(wù)刪除部分?jǐn)?shù)據(jù)后;有些情況下這些數(shù)據(jù)占用的存儲(chǔ)空間會(huì)釋放掉,有些情況這些存儲(chǔ)空間則不會(huì)釋放。以下是對(duì)這種情況的簡(jiǎn)單說(shuō)明:
一、刪除表|清空數(shù)據(jù)表
當(dāng)執(zhí)行刪除數(shù)據(jù)表或者清空數(shù)據(jù)表的全部數(shù)據(jù)操作時(shí),都會(huì)釋放掉相應(yīng)的磁盤(pán)存儲(chǔ)空間。
drop table table_name;
truncate table table_name;
在MyISAM和InnoDB(innodb_file_per_table)存儲(chǔ)引擎中,數(shù)據(jù)信息存在在單個(gè)文件中。刪除表操作和清空數(shù)據(jù)表操作都會(huì)釋放空間。
二、刪除表數(shù)據(jù)
delete from table_name [where xxx];
使用delete刪除的時(shí)候,MySQL并沒(méi)有把數(shù)據(jù)文件刪除,而是將數(shù)據(jù)文件的標(biāo)識(shí)位刪除,沒(méi)有整理文件,因此不會(huì)徹底釋放空間。被刪除的數(shù)據(jù)將會(huì)被保存在一個(gè)鏈接清單中,當(dāng)有新數(shù)據(jù)寫(xiě)入的時(shí)候,MySQL會(huì)利用這些已刪除的空間再寫(xiě)入。即,刪除操作會(huì)帶來(lái)一些數(shù)據(jù)碎片,正是這些碎片在占用硬盤(pán)空間。
三、優(yōu)化表空間
方法一:
optimize table table_name ;
當(dāng)表數(shù)據(jù)被大量刪除后,釋放占用的空間就變得很有必要了。會(huì)明顯的提高查詢速度。使用 optimize table。被刪除的記錄被保持在鏈接清單中,后續(xù)的 insert 操作會(huì)重新使用舊的記錄位置。您可以使用 optimize table 來(lái)重新利用未使用的空間,并整理數(shù)據(jù)文件的碎片。optimize 適用于InnoDB和MyISAM存儲(chǔ)引擎。
查看表占用硬盤(pán)空間大小的SQL語(yǔ)句如下:(默認(rèn)用M做展示單位)
SELECT TABLE_NAME, (DATA_LENGTH+INDEX_LENGTH)/1048576 as size_Mb, TABLE_ROWS FROM information_schema.tables WHERE TABLE_SCHEMA='wow_tencent_1' AND TABLE_NAME='user'
方法二:
alter table tab_name ENGINE = 'InnoDB';
注意:該操作執(zhí)行的時(shí)候會(huì)把該表格先寫(xiě)入一個(gè)tmp臨時(shí)表,所以磁盤(pán)剩余空間必須大于表空間,否則會(huì)執(zhí)行失敗。
方法三:
先將整個(gè)表的結(jié)構(gòu)和數(shù)據(jù)導(dǎo)出來(lái),刪除整個(gè)表,再創(chuàng)建表,最后導(dǎo)入數(shù)據(jù)。生產(chǎn)環(huán)境不建議用這個(gè)方法。
總結(jié)
通過(guò)從InnoDB存儲(chǔ)空間分布,delete對(duì)性能的影響可以看到,delete物理刪除既不能釋放磁盤(pán)空間,而且會(huì)產(chǎn)生大量的碎片,導(dǎo)致索引頻繁分裂,影響SQL執(zhí)行計(jì)劃的穩(wěn)定性;
同時(shí)在碎片回收時(shí),會(huì)耗用大量的CPU,磁盤(pán)空間,影響表上正常的DML操作。
在業(yè)務(wù)代碼層面,應(yīng)該做邏輯標(biāo)記刪除,避免物理刪除;為了實(shí)現(xiàn)數(shù)據(jù)歸檔需求,可以用采用MySQL分區(qū)表特性來(lái)實(shí)現(xiàn),都是DDL操作,沒(méi)有碎片產(chǎn)生。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-655414.html
另外一個(gè)比較好的方案采用Clickhouse,對(duì)有生命周期的數(shù)據(jù)表可以使用Clickhouse存儲(chǔ),利用其TTL特性實(shí)現(xiàn)無(wú)效數(shù)據(jù)自動(dòng)清理。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655414.html
到了這里,關(guān)于MySQL delete刪除數(shù)據(jù)后,釋放磁盤(pán)空間的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!