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. alteroptimize的区别

alter table t engine=InnoDB (也就是recreate) , 而 optimize table t (等于是recreate + analyze)

四、Online DDL

ddldba的日常工作,执行ddl的时候会锁表。特别是执行ddl变更,导致库上大量的线程处于Waiting form meta data lock的状态。因此在MySQL5.5版本后引入了Online DDL

1. Online DDL推出以前

Online DDL推出以前,执行ddl主要有两种方式copy方式和inplace方式,inplace方式又称为(fast index creation)。相对于copy方式,inplace方式不拷贝数据,因此较快。但是这种方式仅支持添加、删除索引两种方式,而且与copy方式一样需要全程锁表,实用性不是很强。Online方式与前两种方式相比,不仅可以读,还可以支持写操作。

2. ALGORITHMLOCK使用

执行Online DDL语句时,使用ALGORITHMLOCK关键字,放在DDL语句最后,用逗号隔开即好

ALTER TABLE t_name ADD COLUMN username varchar(200) , ALGORITHM=INPLACE,LOKC=NONE;

3. ALGORITHMLOCK

  • 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操作磁盘空间不会减少的原因相关推荐

  1. mysql truncate delete 释放磁盘空间

    我的mysql一张表中有1000万条记录,我使用delete删除记录后,虽然表为空,但是我使用navicate打开表时,加载还是很慢.于是我执行下truncate,打开就很快了.网上查下作者这样说的: ...

  2. 为什么mysql的delete操作不释放磁盘空间

    在 InnoDB 中,delete 操作并不会真的删除数据,mysql 实际上只是给要删除的数据打了标记,标记为删除.磁盘所占空间不会变小,即表空间并没有真正被释放. 一. MySQL 删除数据几种情 ...

  3. Mysql定义DELETE操作触发器,将删除数据存入历史表

    Mysql定义DELETE操作触发器,将删除数据存入历史表 SQL如下: // An highlighted blockDELIMITER $$ CREATE TRIGGER <触发器名称> ...

  4. 在UNIX \ Linux终端中的可视化磁盘空间和磁盘使用情况小工具 - Vizex

    在UNIX\ Linux终端中的可视化磁盘空间和磁盘使用情况小工具 - Vizex 背景-什么是Vizex Linux终端上安装方法 如何使用Vizex 1. vezix 2. vizexdf 3. ...

  5. linux oracle流复制文件,【学习笔记】Oracle ASM linux dd命令复制asm中文件 操作磁盘或者分区...

    天萃荷净 使用dd复制asm中文件,随着数据库新版本的推广ASM肯定会越来越被重视,最近准备系统的学习下ASM,以备突发情况需要,这是asm深入学习笔记 1.查询ASM某个数据文件AU信息 SQL&g ...

  6. MySQL 中的共享表空间与独立表空间如何选择

    对于 InnoDB 存储引擎来说,它可以将每张表存放于独立的表空间,即 tablename.ibd 文件;也可以将数据存放于 ibdata 的共享表空间,一般命名是 ibdataX,后面的 X 是一个 ...

  7. MySQL 中的共享表空间与独立表空间,用哪个好呢?

    作者 | 江南一点雨       责编 | 晋兆雨 1.独立表空间与共享表空间 2.该用哪一个? 2.1 独立表空间 2.2 共享表空间 3.迁移 好啦,那我们今天就开始学习 MySQL 中另外一个非 ...

  8. mysql 恢复delete操作_MySQL 误操作后数据恢复(update,delete忘加where条件)

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...

  9. mysql中delete和drop的区别,SQL中DELETE和DROP的简单比较

    在SQL命令中DELETE和DROP都是可以用于删除数据库的元素,那么它们之间有什么区别?下面本篇文章就给大家简单比较一下DELETE和DROP,介绍DELETE和DROP的区别,希望对大家有所帮助. ...

最新文章

  1. Cocos2d-x win7 + vs2010 配置图文详解 .
  2. 《财富》:盖茨的四项黄金法则
  3. android国家坐标,从坐标获取国家?
  4. 2020年你应该学习 .Net Core
  5. python连接不上数据库_pycharm连接mysql数据库连接不上
  6. 这是一个成长差异化的时代
  7. WF的性能特征(一)
  8. Atitit r2017 r5 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0-D3C8 D:\ati\r2017 v4 r
  9. 软件测试面试题及答案,2022最强版
  10. 让读书的人面上有光:亚马逊Kindle青春版上市
  11. joomla新建模板_WordPress v Joomla:模板和主题
  12. vue常用插件(一)
  13. 实例7:stc8a8k定时器0,定时50ms,进入中断之后,加数20次到1秒,计算时间。
  14. 台式计算机启动时 每次按f1,开机按f1的解决方法_电脑开机每次都要按F1,怎么解决...
  15. 高德vue-amap使用(一)标记点位获取地址及经纬度
  16. 安卓UI自动化工具4399AT环境搭建
  17. hydra海德拉 and Medusa美杜莎简单使用教程
  18. Python第二天(重点为字符串)
  19. 操作系统实验(1)—— Linux命令解释程序设计与实现
  20. android 反编译方法、工具介绍

热门文章

  1. 二叉树根结点到叶节点的最短距离
  2. 1108 String复读机(JAVA)
  3. 便捷节省的自动双面打印机或将成为趋势
  4. 智能控制导论 # 模糊控制 1 理论及实例
  5. JDBC--C3P0连接池的工具类编写以及功能测试
  6. cesium加载自定义的mapbox底图
  7. 数字计算机在线用,十进制与二进制在线转换工具
  8. 信息论基础(信息量、熵、KL散度、交叉熵)
  9. c语言输入函数 scanf 详解 - 解决常见输入问题
  10. Tair分布式锁 实践经验(160805更新)