1. 程式人生 > 實用技巧 >mysql delete 資料之後 .MYD檔案大小沒有發生變化

mysql delete 資料之後 .MYD檔案大小沒有發生變化

介紹:

delete只是將資料標識為刪除,並沒有整理資料檔案,當插入新資料後,會再次使用這些被置為刪除標識的記錄空間。(當DELETE後面跟條件的時候 是這種情況,不跟條件直接delete的時候,則不會有這種情況)如
delete from table_name和delete from table_name where 不帶條件的語句清空了表,myd檔案大小為0;但是帶條件的刪除了整個表以後,myd和檔案的大小不變。舉個例子,100個程式設計師辭職走了,但是公司100個職位還在,沒有撤銷,需要等新的程式設計師進來蹲這些坑,但是呢,招到一個合適程式設計師需要時間,大多數時間,這個位置就空在那裡了。檔案大小沒變原因,這是因為刪除操作後在資料檔案中留下碎片所致,當你刪除資料 時,mysql並不會回收被已刪除資料的佔據的儲存空間,以及索引位。

解決辦法:

1.擴充單表容量
先查看錶的狀態:show table status like 'table_name',然後修改表的容量:alter table_name max_rows=2000000000000,avg_low_length=500000。
如圖:

2.釋放表空間
執行 SHOW TABLE STATUS
返回的記錄中有一個 Date_free 欄位.它顯示的是 MyISAM 的表浪費空間.
如圖:

上圖所示,我是刪除了80%的歷史日誌,但是myd檔案大小沒有變化,如下圖:

使用 OPTIMIZE TABLE 指令可以優化它.
OPTIMIZE TABLE 是指對錶進行優化。如果已經刪除了表的一大部分資料,或者如果已經對含有可變長度行的表(含有 VARCHAR 、 BLOB 或 TEXT 列的表)進行了很多更改,就應該使用 OPTIMIZE TABLE 命令來進行表優化。這個命令可以將表中的空間碎片進行合併,並且可以消除由於刪除或者更新造成的空間浪費 。OPTIMIZE TABLE 命令只對 MyISAM 、 BDB 和 InnoDB 表起作用 。表優化的工作可以每週或者每月定期執行,對提高表的訪問效率有一定的好處,但是需要注意的是,優化表期間會鎖定表,所以一定要安排在空閒時段進行。
執行:
OPTIMIZE TABLE table_name;


成功以後,data_free如圖:

檔案改變如圖: