DELETE 不释放磁盘空间
代码语言:javascript复制delete from table_name
原因
使用delete删除的时候,MySQL并没有把数据文件删除,只会将已经删除的数据标记为删除,因此并不会彻底的释放空间。
这些被删除的数据会被保存在一个链接清单中,当有新数据写入的时候,MySQL会利用这些已删除的空间再写入。
删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。这些被标记为删除的记录,就是数据空洞。不仅浪费空间,还影响查询效率。
影响
MySQL 底层是以数据页为单位来存储和读取数据的,每次向磁盘读一次数据就是读一个数据页,每访问一个数据页就对应一次IO操作,磁盘IO访问速度是很慢的。
删除数据释放内存方式
1、使用 drop 或 truncate
代码语言:javascript复制drop table table_name;
truncate table table_name;
2、OPTIMIZE
代码语言:javascript复制optimize table table_name;
OPTIMIZE
适用于InnoDB
和MyISAM
存储引擎。使用OPTIMIZE TABLE来
重新利用未使用的空间,并重新整理数据文件的碎片。
减少表数据与表索引的物理空间,降低访问表时的
IO
。在OPTIMIZE TABLE
运行过程中,MySQL
会锁定表。
3、Alter 命令
代码语言:javascript复制alter table table_name engine=innodb;
4、导出导入
先将整个表的结构和数据导出来,删除整个表,再创建表,最后将旧表数据重新导入新表中。
代码语言:javascript复制-- mysqldump 导出表语法
mysqldump -u用户名 -p密码 -h主机 数据库 表
-- 例如
mysqldump -uroot -p sqlhk9 a --no-data
注意:这种方式会影响业务正常使用,不推荐。
清理 BinLog
要清理 MySQL 的 BinLog,可以按照以下步骤操作:
1、查看 binlog 文件列表
代码语言:javascript复制SHOW BINARY LOGS;
将显示当前所有的 binlog
文件及其对应的文件名。
2、删除特定的 binlog 文件
代码语言:javascript复制PURGE BINARY LOGS TO 'binlog文件名';
这将删除指定文件名及其之前的所有binlog
文件。
例如:如果要删除名为mysql-bin.000003
的binlog
文件及其之前的所有文件,可以运行以下命令:
PURGE BINARY LOGS TO 'mysql-bin.000003';
3、删除所有 binlog 文件
代码语言:javascript复制RESET MASTER;
将删除所有的binlog
文件,并重新生成一个新的binlog
文件。
注意:在清理
binlog
文件之前,确保已经备份了重要的binlog
文件,并且了解清理binlog
文件可能会影响到数据库恢复和复制的风险。