MySQL -- 空间回收

InnoDB的物理存储

  1. InnoDB表的组成:表结构(frm)+数据(ibd)
    1. MySQL 8.0开始,允许将表结构定义(占用空间很小)放在系统数据表中
  2. 控制参数innodb_file_per_table
    1. ON:每个InnoDB表数据存储在一个以.ibd为后缀的文件中,推荐。更容易管理,DROP TABLE会直接删除这个文件
    2. OFF:InnoDB表数据存储在共享表空间,DROP TABLE,空间也是不会回收的
      SHOW VARIABLES LIKE '%innodb_file_per_table%';来查看innodb_file_per_table的参数值。

文件空洞

空洞 :经过大量增删改的表,都会存在空洞

删除

在这里插入图片描述

  1. 如果删掉R4,InnoDB只会将R4标记为删除,如果再插入300~600的记录时,可能会复用这个位置,但磁盘文件不会缩小。记录的复用,仅限于符合范围条件的数据
  2. 如果删除了一个数据页上的所有记录,那么整个数据页都可以被复用的
    1. 当整个页从B+树里摘除后,可以被复用到任何位置
    2. 如果将pa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL或MariaDB中,当执行DELETE语句删除数据时,磁盘空间通常不会立即释放。这是因为MySQL使用了一种称为“Undo Log”的机制来实现事务的回滚和MVCC(多版本并发控制)功能。 当执行DELETE语句时,MySQL会将被删除的数据记录存储在Undo Log中,以便在需要回滚事务或提供MVCC功能时使用。这样做的好处是可以保证数据的一致性和并发性。 然而,这也导致了磁盘空间没有立即释放的情况。要释放磁盘空间,可以通过以下几种方式: 1. 执行OPTIMIZE TABLE命令:这个命令会重新组织表的物理存储,包括回收已删除的空间。但是需要注意的是,OPTIMIZE TABLE命令可能会导致表被锁定,并且在大表上执行时可能需要较长时间。 2. 使用TRUNCATE TABLE命令:TRUNCATE TABLE命令会删除表中的所有数据,并释放磁盘空间。但是需要注意的是,TRUNCATE TABLE命令是DDL语句,会自动提交事务并且无法回滚。 3. 使用ALTER TABLE命令:通过ALTER TABLE命令重建表,可以释放磁盘空间。例如,可以创建一个新表并将数据插入其中,然后删除原表。但是需要注意的是,这种方法可能会导致表结构和索引的重新构建,可能会影响性能。 4. 等待自动回收MySQL会在后台自动回收已删除数据的磁盘空间,这个过程称为垃圾回收。可以通过设置innodb_undo_log_truncate选项来控制垃圾回收的频率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值