MySQL中DELETE操作磁盘空间不会减少的原因
MySQL中delete操作
在
InnoDB中
,delete
操作并不会真的删除数据,mysql
实际上只是给要删除的数据打了标记,标记为删除。磁盘所占空间不会变小,即表空间并没有真正被释放。
这样设计的思考
1. mysql的delete操作,只是做了逻辑上的标记删除,在磁盘上数据并没有被真正删除。
2. 这样的设计是因为:如果在磁盘上移除之后,很多其它的记录需要在磁盘上重新排列,这会消耗大量的性能。(例如:一个大表,存在索引,删除了其中一行,那么整个索引结构就会发生变化,随之而来的改变索引结构,必将带来磁盘IO)
3. 所有被删除的记录会组成一个垃圾链表,这个链表记录占用的空间叫可重用空间。新插入的记录可覆盖此空间。
一、复用表空间
被标记删除的行,是可以被复用的。下次有符合条件的记录可以直接插入到这个被标记的位置。
1. 行记录复用
比如在ID为300-600之间删除ID=500的记录,这条记录被标记为删除。下次如有ID=400的记录要插入,可以复用此ID=500被标记删除的位置。
2. 数据页复用
这种情况是指整个数据页都被标记为删除,所以整个数据页都可以被复用了。和行记录复用不同,数据页复用对要插入的数据几乎没有条件限制。
二、数据空洞
这些被标记为删除的记录,就是数据空洞。不仅浪费空间,还影响查询效率。
1. mysql底层是以数据页为单位来存储和读取数据的,每次向磁盘读一次数据就是读一个数据页,每访问一个数据页就对应一次IO操作,磁盘IO访问速度是很慢的。
2. 如果一个表上存在大量的数据空洞,原本只需要一个数据页就保存的数据,由于被很多空洞占用了空间。不得不增加其它数据页来保存数据,相应的mysql在查询相同数据的时候,就不得不增加磁盘IO操作,从而影响查询速度。
3. 不仅删除会造成数据空洞,插入和更新同样会造成数据空洞。因此一个表在经过大量频繁的增删改后,难免会产生数据空洞,影响查询效率。在生产环境中直接表现为原本查询很快的表变的越来越慢。
三、重建表
此命令的原理就是重建表。建立一个临时表B,然后把A(存在数据空洞的表)中的数据查询出来,全部重新插入到临时表B中。最后再用临时表B替换表A即可,这就是重建表的过程。
optimize table <table_name>;
1. 查询表占用空间的大小
use information_schema;select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables where table_schema='repeater' AND table_name='t_record';
2. alter
重建表命令
推荐使用此命令重建表。
alter table <table_name> engine=InnoDB
3. alter
与optimize
的区别
alter table t engine=InnoDB (也就是recreate) , 而 optimize table t (等于是recreate + analyze)
四、Online DDL
ddl
是dba
的日常工作,执行ddl
的时候会锁表。特别是执行ddl
变更,导致库上大量的线程处于Waiting form meta data lock
的状态。因此在MySQL
5.5版本后引入了Online DDL
1. Online DDL
推出以前
Online DDL推出以前,执行ddl主要有两种方式copy方式和inplace方式,inplace方式又称为(fast index creation)。相对于copy方式,inplace方式不拷贝数据,因此较快。但是这种方式仅支持添加、删除索引两种方式,而且与copy方式一样需要全程锁表,实用性不是很强。Online方式与前两种方式相比,不仅可以读,还可以支持写操作。
2. ALGORITHM
与LOCK
使用
执行
Online DDL
语句时,使用ALGORITHM
与LOCK
关键字,放在DDL
语句最后,用逗号隔开即好
ALTER TABLE t_name ADD COLUMN username varchar(200) , ALGORITHM=INPLACE,LOKC=NONE;
3. ALGORITHM
与LOCK
ALGORITHM
选项
INPLACE
替换 :直接在原表上执行DDL
操作COPY
复制 : 使用一种临时表方式,克隆一个临时表,在临时表上执行DDL
,然后在把数据导入临时表中,在重名名等。这期间需要多出一倍的磁盘空间来支持此操作。执行期间表不允许DML
操作DEFAULT
默认方式 : 由MYSQL
自己选择,有先使用INPLACE
方式LOCK
选项
SHARE
共享锁 :执行DDL
的表可读,但不可写NONE
没有任何限制 :执行DDL
的表可读可写EXCLUSIVE
排它锁 :执行DDL
的表不可读,不可写DEFAULT
默认方式 :执行DDL
的时不指定LOCK
子句的时候使用的默认值。如果指定的值为DEFAULT
,那就交给MYSQL
子句去觉得锁表还是不锁表。不建议使用,如果你确定DDL
语句不会锁表,可以不指定LOCK
或指定它的值为DEFAULT
,否则建议指定其它的类型。
执行DDL操作时,ALGORITHM选项可以不指定,这时候MySQL按照INSTANT、INPLACE、COPY的顺序自动选择合适的模式。也可以指定ALGORITHM=DEFAULT,也是同样的效果。如果指定了ALGORITHM选项,但不支持的话,会直接报错。OPTIMIZE TABLE 和 ALTER TABLE 表名 ENGINE=INNODB都支持Oline DDL,但依旧建议在业务访问量低的时候使用.
五、参考文档
mysql删除操作其实是假删除
MYSQL 表数据 delete 删除后,为何还占用存储空间?
MySQL中DELETE操作磁盘空间不会减少的原因相关推荐
- mysql truncate delete 释放磁盘空间
我的mysql一张表中有1000万条记录,我使用delete删除记录后,虽然表为空,但是我使用navicate打开表时,加载还是很慢.于是我执行下truncate,打开就很快了.网上查下作者这样说的: ...
- 为什么mysql的delete操作不释放磁盘空间
在 InnoDB 中,delete 操作并不会真的删除数据,mysql 实际上只是给要删除的数据打了标记,标记为删除.磁盘所占空间不会变小,即表空间并没有真正被释放. 一. MySQL 删除数据几种情 ...
- Mysql定义DELETE操作触发器,将删除数据存入历史表
Mysql定义DELETE操作触发器,将删除数据存入历史表 SQL如下: // An highlighted blockDELIMITER $$ CREATE TRIGGER <触发器名称> ...
- 在UNIX \ Linux终端中的可视化磁盘空间和磁盘使用情况小工具 - Vizex
在UNIX\ Linux终端中的可视化磁盘空间和磁盘使用情况小工具 - Vizex 背景-什么是Vizex Linux终端上安装方法 如何使用Vizex 1. vezix 2. vizexdf 3. ...
- linux oracle流复制文件,【学习笔记】Oracle ASM linux dd命令复制asm中文件 操作磁盘或者分区...
天萃荷净 使用dd复制asm中文件,随着数据库新版本的推广ASM肯定会越来越被重视,最近准备系统的学习下ASM,以备突发情况需要,这是asm深入学习笔记 1.查询ASM某个数据文件AU信息 SQL&g ...
- MySQL 中的共享表空间与独立表空间如何选择
对于 InnoDB 存储引擎来说,它可以将每张表存放于独立的表空间,即 tablename.ibd 文件;也可以将数据存放于 ibdata 的共享表空间,一般命名是 ibdataX,后面的 X 是一个 ...
- MySQL 中的共享表空间与独立表空间,用哪个好呢?
作者 | 江南一点雨 责编 | 晋兆雨 1.独立表空间与共享表空间 2.该用哪一个? 2.1 独立表空间 2.2 共享表空间 3.迁移 好啦,那我们今天就开始学习 MySQL 中另外一个非 ...
- mysql 恢复delete操作_MySQL 误操作后数据恢复(update,delete忘加where条件)
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...
- mysql中delete和drop的区别,SQL中DELETE和DROP的简单比较
在SQL命令中DELETE和DROP都是可以用于删除数据库的元素,那么它们之间有什么区别?下面本篇文章就给大家简单比较一下DELETE和DROP,介绍DELETE和DROP的区别,希望对大家有所帮助. ...
最新文章
- Cocos2d-x win7 + vs2010 配置图文详解 .
- 《财富》:盖茨的四项黄金法则
- android国家坐标,从坐标获取国家?
- 2020年你应该学习 .Net Core
- python连接不上数据库_pycharm连接mysql数据库连接不上
- 这是一个成长差异化的时代
- WF的性能特征(一)
- Atitit r2017 r5 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0-D3C8 D:\ati\r2017 v4 r
- 软件测试面试题及答案,2022最强版
- 让读书的人面上有光:亚马逊Kindle青春版上市
- joomla新建模板_WordPress v Joomla:模板和主题
- vue常用插件(一)
- 实例7:stc8a8k定时器0,定时50ms,进入中断之后,加数20次到1秒,计算时间。
- 台式计算机启动时 每次按f1,开机按f1的解决方法_电脑开机每次都要按F1,怎么解决...
- 高德vue-amap使用(一)标记点位获取地址及经纬度
- 安卓UI自动化工具4399AT环境搭建
- hydra海德拉 and Medusa美杜莎简单使用教程
- Python第二天(重点为字符串)
- 操作系统实验(1)—— Linux命令解释程序设计与实现
- android 反编译方法、工具介绍