drop table table_name
立刻釋放磁盤(pán)空間 消恍,不管是 Innodb和MyISAM 以现;
truncate table table_name
立刻釋放磁盤(pán)空間 ,不管是 Innodb和MyISAM;
delete from table_name
刪除表的全部數(shù)據(jù)佣赖,對(duì)于MyISAM 會(huì)立刻釋放磁盤(pán)空間 记盒,而InnoDB 不會(huì)釋放磁盤(pán)空間纪吮;
delete from table_name where xx
帶條件的刪除, 不管是innodb還是MyISAM都不會(huì)釋放磁盤(pán)空間;
delete操作后使用optimize table table_name
釋放磁盤(pán)空間棚辽,優(yōu)化表期間會(huì)鎖定表冰肴,所以要在空閑時(shí)段執(zhí)行optimize table ,測(cè)試十幾個(gè)G數(shù)據(jù)的表執(zhí)行optimize table 大概20多分鐘估盘。
注:delete刪除數(shù)據(jù)的時(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)空間。
OPTIMIZE TABLE命令優(yōu)化表慎皱,該命令會(huì)重新利用未使用的空間,并整理數(shù)據(jù)文件的碎片茫多;該命令將會(huì)整理表數(shù)據(jù)和相關(guān)的索引數(shù)據(jù)的物理存儲(chǔ)空間地梨,用來(lái)減少占用的磁盤(pán)空間,并提高訪問(wèn)表時(shí)候的IO性能洁闰;但是具體對(duì)表產(chǎn)生的影響是依賴(lài)于表使用的存儲(chǔ)引擎的万细。該命令對(duì)視圖無(wú)效。
使用optimize table table_name出現(xiàn)Table does not support optimize, doing recreate + analyze instead 的解決辦法:
innodb的數(shù)據(jù)庫(kù)不支持optimize腰素,可以用 ALTER TABLE table.name ENGINE='InnoDB';對(duì)舊表以復(fù)制的方式新建一個(gè)新表雪营,然后刪除舊表献起。操作前最好備份表镣陕。
重新啟動(dòng)mysql 姻政,在啟動(dòng)的時(shí)候指定–skip-new
或者–safe-mode
選項(xiàng)來(lái)支持optimize功能 再執(zhí)行optimize table table_name
>/usr/local/mysql/bin/mysqladmin -uroot -p shutdown --停止mysql
>/usr/local/mysql/bin/mysqld --skip-new & --啟動(dòng)mysql
>mysql -uroot -p --在服務(wù)器上連接mysql
mysql>use db_name;
刪除數(shù)據(jù)并執(zhí)行了optimize table釋放了磁盤(pán)空間汁展;optimize命令優(yōu)化表 不要頻繁操作,另外還發(fā)現(xiàn)執(zhí)行optimize命令 Innodb 引擎的數(shù)據(jù)庫(kù)下ibtmp1 文件由原來(lái)的幾個(gè)Gy優(yōu)化成12M了侈咕。
但如果數(shù)據(jù)每天都大量插入炫欺,刪除數(shù)據(jù)后不執(zhí)行optimize table, insert 數(shù)據(jù)的時(shí)候會(huì)占用已經(jīng)刪除那部分?jǐn)?shù)據(jù)的空間品洛,數(shù)據(jù)文件所占用的磁盤(pán)空間短時(shí)間并不會(huì)增長(zhǎng),所以要減少數(shù)據(jù)文件占用磁盤(pán)空間桥状,可以對(duì)表進(jìn)行壓縮辅斟。