为什么MySQL|为什么MySQL 删除表数据 磁盘空间还一直被占用
目录
- 1、Mysql数据结构
- 2、表文件大小未更改和mysql设计有关
- 3、那怎么才能让表大小变小
- 4、Online DDL
- 5、总结
为了节约成本,定期进行数据备份,并通过
delete
删除表记录。明明已经执行了
delete
,可表文件的大小却没减小,令人费解项目中使用
Mysql
作为数据库,对于表来说,一般为表结构和表数据。表结构占用空间都是比较小的,一般都是表数据占用的空间。当我们使用
delete
删除数据时,确实删除了表中的数据记录,但查看表文件大小却没什么变化。1、Mysql数据结构 凡是使用过
mysql
,对B+树
肯定是有所耳闻的,MySQL InnoDB
中采用了 B+
树作为存储数据的结构,也就是常说的索引组织表,并且数据时按照页来存储的。因此在删除数据时,会有两种情况:- 删除数据页中的某些记录
- 删除整个数据页的内容
2、表文件大小未更改和mysql设计有关
比如想要删除 R4 这条记录:
文章图片
InnoDB
直接将 R4
这条记录标记为删除,称为可复用的位置。如果之后要插入 ID
在 300
到 700
间的记录时,就会复用该位置。由此可见,磁盘文件的大小并不会减少。
通用删除整页数据也将记录标记删除,数据就复用用该位置,与删除默写记录不同的是,删除整页记录,当后来插入的数据不在原来的范围时,都可以复用位置,而如果只是删除默写记录,是需要插入数据符合删除记录位置的时候才能复用。
因此,无论是数据行的删除还是数据页的删除,都是将其标记为删除的状态,用于复用,所以文件并不会减小。
3、那怎么才能让表大小变小 【为什么MySQL|为什么MySQL 删除表数据 磁盘空间还一直被占用】
DELETE
只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间,可以使用OPTIMIZE TABLE
来回收未使用的空间,并整理数据文件的碎片。OPTIMIZE TABLE 表名;
注意:
OPTIMIZE TABLE
只对MyISAM
, BDB
和InnoDB
表起作用。另外,也可以执行通过
ALTER TABLE
重建表ALTER TABLE 表名 ENGINE=INNODB
有人会问
OPTIMIZE TABLE
和ALTER TABLE
有什么区别?alter table t engine = InnoDB
(也就是recreate),而 optimize table t
等于 recreate+analyze
4、Online DDL 最后,再说一下
Online DDL
,dba
的日常工作肯定有一项是ddl变更,ddl变更会锁表,这个可以说是dba
心中永远的痛,特别是执行ddl
变更,导致库上大量线程处于“Waiting for meta data lock
”状态的时候。因此在 5.6 版本后引入了 Online DDL
。Online DDL
推出以前,执行ddl主要有两种方式copy
方式和inplace
方式,inplace
方式又称为(fast index creation
)。相对于copy
方式,inplace
方式不拷贝数据,因此较快。但是这种方式仅支持添加、删除索引两种方式,而且与copy方式一样需要全程锁表,实用性不是很强。Online
方式与前两种方式相比,不仅可以读,还可以支持写操作。执行
online DDL
语句的时候,使用ALGORITHM
和LOCK
关键字,这两个关键字在我们的DDL
语句的最后面,用逗号隔开即可。示例如下:ALTER TABLE tbl_name ADD COLUMN col_name col_type, ALGORITHM=INPLACE, LOCK=NONE;
ALGORITHM选项
- INPLACE:替换:直接在原表上面执行
DDL
的操作。 - COPY:复制:使用一种临时表的方式,克隆出一个临时表,在临时表上执行
DDL
,然后再把数据导入到临时表中,在重命名等。这期间需要多出一倍的磁盘空间来支撑这样的 操作。执行期间,表不允许DML
的操作。 - DEFAULT:默认方式,有
MySQL
自己选择,优先使用INPLACE
的方式。
- LOCK选项
- SHARE:共享锁,执行
DDL
的表可以读,但是不可以写。 - NONE:没有任何限制,执行
DDL
的表可读可写。 - EXCLUSIVE:排它锁,执行
DDL
的表不可以读,也不可以写。 - DEFAULT:默认值,也就是在
DDL
语句中不指定LOCK
子句的时候使用的默认值。如果指定LOCK
的值为
DEFAULT
,那就是交给MySQL
子句去觉得锁还是不锁表。不建议使用,如果你确定你的DDL
语句不会锁表,你可以不指定lock
或者指定它的值为default
,否则建议指定它的锁类型。执行
DDL
操作时,ALGORITHM
选项可以不指定,这时候MySQL
按照INSTANT
、INPLACE
、COPY
的顺序自动选择合适的模式。也可以指定ALGORITHM=DEFAULT
,也是同样的效果。如果指定了ALGORITHM
选项,但不支持的话,会直接报错。OPTIMIZE TABLE
和 ALTER TABLE
表名 ENGINE=INNODB
都支持Oline DDL
,但依旧建议在业务访问量低的时候使用5、总结
delete
删除数据时,其实对应的数据行并不是真正的删除,仅仅是将其标记成可复用的状态,所以表空间不会变小。可以重建表的方式,快速将
delete
数据后的表变小(OPTIMIZE TABLE
或ALTER TABLE
),在 5.6 版本后,创建表已经支持 Online
的操作,但最好是在业务低峰时使用到此这篇关于为什么MySQL 删除表数据 磁盘空间还一直被占用的文章就介绍到这了,更多相关
MySQL
删除表数据 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!推荐阅读
- 为什么你的路演总会超时()
- 财商智慧课(六)
- 吃了早餐,反而容易饿(为什么?)
- 为什么越花钱的人越有钱,越舍不得花钱的人却越穷()
- dubbo基本认识
- 为什么985/211的学生能胜任工作获得老板的青睐。
- 年轻人,干了孤独这杯酒
- 为什么孩子一定要学会可视化思维!
- 关于this的一些问题(1)
- 为什么有些女孩喜欢看玛丽苏爱情片()