博客
关于我
面试官问:数据库 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/

    你可能感兴趣的文章
    Navicat连接Oracle出现Oracle library is not loaded的解决方法
    查看>>
    Navicat连接Oracle数据库以及Oracle library is not loaded的解决方法
    查看>>
    Navicat连接sqlserver提示:未发现数据源名并且未指定默认驱动程序
    查看>>
    navicat连接远程mysql数据库
    查看>>
    Navicat通过存储过程批量插入mysql数据
    查看>>
    Navicat(数据库可视化操作软件)安装、配置、测试
    查看>>
    navigationController
    查看>>
    NB-IOT使用LWM2M移动onenet基础通信套件对接之APN设置
    查看>>
    NBear简介与使用图解
    查看>>
    Vue过滤器_使用过滤器进行数据格式化操作---vue工作笔记0015
    查看>>
    Ncast盈可视 高清智能录播系统 IPSetup.php信息泄露+RCE漏洞复现(CVE-2024-0305)
    查看>>
    NCNN中的模型量化解决方案:源码阅读和原理解析
    查看>>
    NCNN源码学习(1):Mat详解
    查看>>
    nc命令详解
    查看>>
    NC综合漏洞利用工具
    查看>>
    ndarray 比 recarray 访问快吗?
    查看>>
    ndk-cmake
    查看>>
    NdkBootPicker 使用与安装指南
    查看>>
    ndk特定版本下载
    查看>>
    NDK编译错误expected specifier-qualifier-list before...
    查看>>