博客
关于我
面试官问:数据库 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 数据类型一日期
    查看>>
    MySQL 数据类型和属性
    查看>>
    mysql 敲错命令 想取消怎么办?
    查看>>
    Mysql 整形列的字节与存储范围
    查看>>
    mysql 断电数据损坏,无法启动
    查看>>
    MySQL 日期时间类型的选择
    查看>>
    Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
    查看>>
    MySQL 是如何加锁的?
    查看>>
    MySQL 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>