博客
关于我
面试官问:数据库 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:int类型升级到bigint,对PHP开发语言影响
    查看>>
    Mysql:mysql 5.X 报错 ERROR 1193 (HY000): Unknown system variable ‘validate_password_length‘
    查看>>
    MySQL:MySQL执行一条SQL查询语句的执行过程
    查看>>
    Mysql:SQL性能分析
    查看>>
    mysql:SQL按时间查询方法总结
    查看>>
    MySQL:什么样的字段适合加索引?什么样的字段不适合加索引
    查看>>
    MySQL:判断逗号分隔的字符串中是否包含某个字符串
    查看>>
    MySQL:某个ip连接mysql失败次数过多,导致ip锁定
    查看>>
    MySQL:索引失效场景总结
    查看>>
    Mysql:避免重复的插入数据方法汇总
    查看>>
    MyS中的IF
    查看>>
    M_Map工具箱简介及地理图形绘制
    查看>>
    m_Orchestrate learning system---二十二、html代码如何变的容易
    查看>>
    M×N 形状 numpy.ndarray 的滑动窗口
    查看>>
    m个苹果放入n个盘子问题
    查看>>
    n = 3 , while n , continue
    查看>>
    n 叉树后序遍历转换为链表问题的深入探讨
    查看>>
    N!
    查看>>
    N-Gram的基本原理
    查看>>
    n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
    查看>>