MySQL 刪除資料後,空間並不會釋放出來,可以使用 OPTIMIZE TABLE 來釋放空間,OPTIMIZE 等同於 TABLE Copy & RENAME,所以會有大量 IO。
我是採用兩種方式來做,依照資料量大小來做選擇。(一樣會有大量IO,但是可以自己掌握,缺點是執行時會有短暫的時間可能漏資料)
不過資料量過大的,還是建議另外處理,這種作法是非常不得已的。
MySQL Table RENAME、重建作法
資料量小,可以瞬間新增完畢(大概10萬筆以下)
- CREATE TABLE table_new LIKE table_now;
- RENAME TABLE table_now TO table_old;
- RENAME TABLE table_new TO table_now;
- INSERT table_now SELECT * FROM table_new;
資料量中大,資料先新增後,再來 RENAME,再來補中間漏的資料
- CREATE TABLE table_new LIKE table_now;
- INSERT table_new SELECT * FROM table_now;
- RENAME TABLE table_now TO table_old;
- RENAME TABLE table_new TO table_now;
- INSERT table_new SELECT * FROM table_now WHERE id > xxx;
- 可能需要用:INSERT IGNORE table_new SELECT * FROM talbe_now WHERE id > xxx;
上述 INSERT table_new SELECT * FROM table_now; 可能會遇到下述錯誤訊息:
- ERROR 1062 (23000): Duplicate entry 'AA' for key 'PRIMARY'
預設遇到 Duplicate Key (ERROR 1062 (23000): Duplicate entry 'AA' for key 'PRIMARY') 就會停止 INSERT,遇到 Duplicate Key 跳過繼續寫入其它語法,可以使用下述(INSERT IGNORE):
- INSERT IGNORE table_new SELECT * FROM talbe_now;