最近面试,还真有一个面试官,问到我以前遇到过的一个线上故障问题解决方案(当面试官说出口时,我暗自庆幸还好我遇到过......),以下。mysql
最近有个上位机获取下位机上报数据的项目,因为上报频率比较频繁且数据量大,致使数据增加过快,磁盘占用多。面试
为了节约成本,按期进行数据备份,并经过delete删除表记录。sql
明明已经执行了delete,可表文件的大小却没减少,使人费解数据库
项目中使用Mysql做为数据库,对于表来讲,通常为表结构和表数据。表结构占用空间都是比较小的,通常都是表数据占用的空间。数据结构
当咱们使用 delete删除数据时,确实删除了表中的数据记录,但查看表文件大小却没什么变化。spa
凡是使用过mysql,对B+树确定是有所耳闻的,MySQL InnoDB 中采用了 B+ 树做为存储数据的结构,也就是常说的索引组织表,而且数据时按照页来存储的。所以在删除数据时,会有两种状况:线程
好比想要删除 R4 这条记录:设计
InnoDB 直接将 R4 这条记录标记为删除,称为可复用的位置。若是以后要插入 ID 在 300 到 700 间的记录时,就会复用该位置。因而可知,磁盘文件的大小并不会减小。code
通用删除整页数据也将记录标记删除,数据就复用用该位置,与删除默写记录不一样的是,删除整页记录,当后来插入的数据不在原来的范围时,均可以复用位置,而若是只是删除默写记录,是须要插入数据符合删除记录位置的时候才能复用。索引
所以,不管是数据行的删除仍是数据页的删除,都是将其标记为删除的状态,用于复用,因此文件并不会减少。
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
最后,再说一下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;
执行DDL操做时,ALGORITHM选项能够不指定,这时候MySQL按照INSTANT、INPLACE、COPY的顺序自动选择合适的模式。也能够指定ALGORITHM=DEFAULT,也是一样的效果。若是指定了ALGORITHM选项,但不支持的话,会直接报错。
OPTIMIZE TABLE 和 ALTER TABLE 表名 ENGINE=INNODB都支持Oline DDL,但依旧建议在业务访问量低的时候使用
delete 删除数据时,其实对应的数据行并非真正的删除,仅仅是将其标记成可复用的状态,因此表空间不会变小。
能够重建表的方式,快速将delete数据后的表变小(OPTIMIZE TABLE 或ALTER TABLE),在 5.6 版本后,建立表已经支持 Online 的操做,但最好是在业务低峰时使用。
来源:https://www.toutiao.com/i6935...