最近面试,还真有一个面试官,问到我之前遇到过的一个线上故障问题解决方案(当面试官说进口时,我暗自庆幸还好我遇到过......),如下。

最近有个上位机获取下位机上报数据的我的项目,因为上报频率比拟频繁且数据量大,导致数据增长过快,磁盘占用多。

为了节约老本,定期进行数据备份,并通过delete删除表记录。

明明曾经执行了delete,可表文件的大小却没减小,令人费解

我的项目中应用Mysql作为数据库,对于表来说,个别为表构造和表数据。表构造占用空间都是比拟小的,个别都是表数据占用的空间。

当咱们应用 delete删除数据时,的确删除了表中的数据记录,但查看表文件大小却没什么变动。

Mysql数据结构

但凡应用过mysql,对B+树必定是有所耳闻的,MySQL InnoDB 中采纳了 B+ 树作为存储数据的构造,也就是常说的索引组织表,并且数据时依照页来存储的。因而在删除数据时,会有两种状况:

  • 删除数据页中的某些记录
  • 删除整个数据页的内容

表文件大小未更改和mysql设计无关

比方想要删除 R4 这条记录:

InnoDB 间接将 R4 这条记录标记为删除,称为可复用的地位。如果之后要插入 ID 在 300 到 700 间的记录时,就会复用该地位。由此可见,磁盘文件的大小并不会缩小。

通用删除整页数据也将记录标记删除,数据就复用用该地位,与删除默写记录不同的是,删除整页记录,当起初插入的数据不在原来的范畴时,都能够复用地位,而如果只是删除默写记录,是须要插入数据合乎删除记录地位的时候能力复用。

因而,无论是数据行的删除还是数据页的删除,都是将其标记为删除的状态,用于复用,所以文件并不会减小。

那怎么能力让表大小变小

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

最初,再说一下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,但仍旧倡议在业务访问量低的时候应用

总结

delete 删除数据时,其实对应的数据行并不是真正的删除,仅仅是将其标记成可复用的状态,所以表空间不会变小。

能够重建表的形式,疾速将delete数据后的表变小(OPTIMIZE TABLE 或ALTER TABLE),在 5.6 版本后,创立表曾经反对 Online 的操作,但最好是在业务低峰时应用。

起源:https://www.toutiao.com/i6935...