MySQL 删除数据不释放内存

2023-09-01 20:35:34 浏览数 (1)

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适用于InnoDBMyISAM存储引擎。使用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.000003binlog文件及其之前的所有文件,可以运行以下命令:

代码语言:javascript复制
PURGE BINARY LOGS TO 'mysql-bin.000003';

3、删除所有 binlog 文件

代码语言:javascript复制
RESET MASTER;

将删除所有的binlog文件,并重新生成一个新的binlog文件。

注意:在清理binlog文件之前,确保已经备份了重要的binlog文件,并且了解清理binlog文件可能会影响到数据库恢复和复制的风险。

0 人点赞