DELETE 不釋放磁盤空間
delete from table_name
原因
使用delete刪除的時候,MySQL并沒有把數據文件刪除,只會將已經刪除的數據標記為刪除,因此并不會徹底的釋放空間。
這些被刪除的數據會被保存在一個鏈接清單中,當有新數據寫入的時候,MySQL會利用這些已刪除的空間再寫入。
刪除操作會帶來一些數據碎片,正是這些碎片在占用硬盤空間。這些被標記為刪除的記錄,就是數據空洞。不僅浪費空間,還影響查詢效率。
影響
MySQL 底層是以數據頁為單位來存儲和讀取數據的,每次向磁盤讀一次數據就是讀一個數據頁,每訪問一個數據頁就對應一次IO操作,磁盤IO訪問速度是很慢的。
刪除數據釋放內存方式
1、使用 drop 或 truncate
drop table table_name;
truncate table table_name;
2、OPTIMIZE
optimize table table_name;
OPTIMIZE
適用于InnoDB
和MyISAM
存儲引擎。使用OPTIMIZE TABLE來
重新利用未使用的空間,并重新整理數據文件的碎片。
減少表數據與表索引的物理空間,降低訪問表時的
IO
。在OPTIMIZE TABLE
運行過程中,MySQL
會鎖定表。
3、Alter 命令
alter table table_name engine=innodb;
4、導出導入
先將整個表的結構和數據導出來,刪除整個表,再創建表,最后將舊表數據重新導入新表中。
-- mysqldump 導出表語法
mysqldump -u用戶名 -p密碼 -h主機 數據庫 表
-- 例如
mysqldump -uroot -p sqlhk9 a --no-data
注意:這種方式會影響業務正常使用,不推薦。
清理 BinLog
要清理 MySQL 的 BinLog,可以按照以下步驟操作:
1、查看 binlog 文件列表
SHOW BINARY LOGS;
將顯示當前所有的 binlog
文件及其對應的文件名。
2、刪除特定的 binlog 文件
PURGE BINARY LOGS TO 'binlog文件名';
這將刪除指定文件名及其之前的所有binlog
文件。
例如:如果要刪除名為mysql-bin.000003
的binlog
文件及其之前的所有文件,可以運行以下命令:
PURGE BINARY LOGS TO 'mysql-bin.000003';
3、刪除所有 binlog 文件
RESET MASTER;
將刪除所有的binlog
文件,并重新生成一個新的binlog
文件。
注意:在清理
binlog
文件之前,確保已經備份了重要的binlog
文件,并且了解清理binlog
文件可能會影響到數據庫恢復和復制的風險。