博客
关于我
面试官问:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?
阅读量:476 次
发布时间:2019-03-06

本文共 1214 字,大约阅读时间需要 4 分钟。

在使用MySQL InnoDB时,删除数据的操作可能会让人感到困惑:删除了数据之后,磁盘空间为什么不会减少?为什么数据文件的大小看起来没有变化?其实,这背后有着深刻的技术原理。让我带你一步步了解。

数据删除背后的原理

MySQL InnoDB采用B+树存储数据结构,数据是按页存储的。每个数据页包含多个记录。当我们执行DELETE操作时,实际上并不是物理删除数据记录,而是将其标记为“可复用”状态。这种标记让数据库知道这些记录可以被后续的插入操作复用,从而释放空间。

数据页的复用机制

在InnoDB中,数据被组织成数据页(称为"叶子节点")。每个数据页存储多个记录。当删除记录时,InnoDB会将其标记为可复用的位置。如果后续插入的数据键值在可用位置范围内(例如,插入的键值在已标记为可复用的记录的键值范围内),就会复用这些空间。如果不在范围内,则需要新建数据页,增加磁盘空间的使用。

删除操作的两种情况

  • 删除单条记录:标记该记录为可复用。
  • 删除整页记录:标记整个数据页为可复用。
  • 无论是哪种情况,磁盘文件的大小都不会立即减少,因为这些记录仍然占用了空间,只是被标记为可复用。只有通过优化操作(如OPTIMIZE TABLE或ALTER TABLE)才能真正释放空间。

    优化表空间

    为了有效管理数据库容量,可以使用以下方法:

  • OPTIMIZE TABLE:这个命令会扫描表中的记录,找出未使用的碎片,并将其移除。适用于MyISAM、BDB和InnoDB表。
  • ALTER TABLE重建表:通过重建表,可以快速恢复到较小的状态。尤其是在高版本MySQL(如5.6及以上)中,支持在线DDL操作,减少对业务的影响。
  • 在线DDL:解锁更高效的操作

    在高版本MySQL中,Online DDL让DDL操作不再是阻塞任务。通过使用ALGORITHM和LOCK选项,可以灵活控制操作方式:

    • ALGORITHM选项

      • INPLACE:直接修改表结构,不需要复制数据,适合频繁修改表结构的情况。
      • COPY:创建临时表,执行DDL操作后,数据重新导入临时表,适合需要数据一致性的场景。
      • DEFAULT:MySQL自动选择合适的算法。
    • LOCK选项

      • SHARE:允许读操作,禁止写操作。
      • NONE:允许读写操作。
      • EXCLUSIVE:禁止读写操作。
      • DEFAULT:默认锁机制,不建议使用。

    业务低峰期执行关键操作

    为了避免影响业务连续性,建议在业务低峰期执行容量优化操作。例如,使用OPTIMIZE TABLE或ALTER TABLE重建表。这些操作可以有效减少磁盘占用,但需要确保系统稳定运行。

    结论

    删除数据后,磁盘空间不减少的原因在于InnoDB采用标记清理机制。通过标记可复用空间,可以在不影响业务连续性的情况下优化表空间。同时,掌握OPTIMIZE TABLE和Online DDL等技术,可以更高效地管理数据库容量,提升系统性能。

    转载地址:http://xoqbz.baihongyu.com/

    你可能感兴趣的文章
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>
    MySQL中的DB、DBMS、SQL
    查看>>