数据库 delete 表数据磁盘空间还是被一直占用为什么-_第1页
数据库 delete 表数据磁盘空间还是被一直占用为什么-_第2页
数据库 delete 表数据磁盘空间还是被一直占用为什么-_第3页
数据库 delete 表数据磁盘空间还是被一直占用为什么-_第4页
数据库 delete 表数据磁盘空间还是被一直占用为什么-_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面试官问:数据库delete表数据,磁盘空间还是被一直占用,为什么?最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多。为了节约成本,定期进行数据备份,并通过delete删除表记录。明明已经执行了delete,可表文件的大小却没减小,令人费解项目中使用Mysql作为数据库,对于表来说,一般为表结构和表数据。表结构占用空间都是比较小的,一般都是表数据占用的空间。当我们使用delete删除数据时,确实删除了表中的数据记录,但查看表文件大小却没什么变化。Mysql数据结构凡是使用过mysql,对B+树肯定是有所耳闻的,MySQLInnoDB中采用了B+树作为存储数据的结构,也就是常说的索引组织表,并且数据时按照页来存储的。因此在删除数据时,会有两种情况:删除数据页中的某些记录删除整个数据页的内容表文件大小未更改和mysql设计有关比如想要删除R4这条记录:InnoDB直接将R4这条记录标记为删除,称为可复用的位置。如果之后要插入ID在300到700间的记录时,就会复用该位置。由此可见,磁盘文件的大小并不会减少。通用删除整页数据也将记录标记删除,数据就复用用该位置,与删除默写记录不同的是,删除整页记录,当后来插入的数据不在原来的范围时,都可以复用位置,而如果只是删除默写记录,是需要插入数据符合删除记录位置的时候才能复用。因此,无论是数据行的删除还是数据页的删除,都是将其标记为删除的状态,用于复用,所以文件并不会减小。那怎么才能让表大小变小DELETE只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间,可以使用OPTIMIZETABLE来回收未使用的空间,并整理数据文件的碎片。OPTIMIZE

TABLE

表名;注意:OPTIMIZETABLE只对MyISAM,BDB和InnoDB表起作用。另外,也可以执行通过ALTERTABLE重建表ALTER

TABLE

表名

ENGINE=INNODB有人会问OPTIMIZETABLE和ALTERTABLE有什么区别?altertabletengine=InnoDB(也就是recreate),而optimizetablet等于recreate+analyzeOnlineDDL最后,再说一下OnlineDDL,dba的日常工作肯定有一项是ddl变更,ddl变更会锁表,这个可以说是dba心中永远的痛,特别是执行ddl变更,导致库上大量线程处于“Waitingformetadatalock”状态的时候。因此在5.6版本后引入了OnlineDDL。在公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。OnlineDDL推出以前,执行ddl主要有两种方式copy方式和inplace方式,inplace方式又称为(fastindexcreation)。相对于copy方式,inplace方式不拷贝数据,因此较快。但是这种方式仅支持添加、删除索引两种方式,而且与copy方式一样需要全程锁表,实用性不是很强。Online方式与前两种方式相比,不仅可以读,还可以支持写操作。执行onlineDDL语句的时候,使用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选项,但不支持的话,会直接报错。OPTIMIZETABLE和ALTERTABLE表名ENGINE=INNODB都支持OlineDDL,但依旧建议在业务访问量低的时候使用总结delete删除数据时,其实对应的数据行并不是真正的删除,仅仅是将其标记成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论