MySQL 在大量删除后回收索引空间?

MySQL 在大量删除后回收索引空间?

在 MySQL 中执行大量删除后,我理解你需要运行 NULL ALTER 来回收磁盘空间,这对于回收索引空间是否也同样适用?

我们的表使用了超过 10G 的索引空间,并且删除/归档了大量数据,不确定是否需要重建表以减少表的大小指数

有人能提供一些建议吗?

我们正在尝试避免重建表,因为这会花费相当长的时间并锁定表。

谢谢!

答案1

您正在使用 InnoDB。遗憾的是,在默认配置下,InnoDB 永远不会归还磁盘空间,除非您使用innodb_file_per_table,在这种情况下,可以通过运行 来重新回收磁盘空间optimize table foo

如果您不使用innodb_file_per_table,那么您需要执行以下操作:

  1. 用于mysqldump将数据库转储到文件中。
  2. 删除你的数据库。
  3. 停止 mysql。
  4. 删除您的 innodb 文件(或将其移动到其他地方)。
  5. 启动 mysql。
  6. 重新创建数据库并从 mysqldump 文件重新导入。

不用说,在执行此操作之前,您最好确保有非常好的备份。此外,强烈建议innodb_file_per_table在 mysql 停止时启用它。

答案2

我有这种方法。

  1. 将表名称更改为 tmp:

    rename table pppoe_auth_users to pppoe_auth_users_tmp;
    
  2. 禁用键:

    ALTER TABLE pppoe_auth_users_tmp DISABLE KEYS;
    
  3. 重新创建表:

    CREATE TABLE `pppoe_auth_users` (
      `host` varchar(128) CHARACTER SET latin1 DEFAULT NULL,
      `username` varchar(128) CHARACTER SET latin1 DEFAULT NULL,
      `vlan` int(20) DEFAULT NULL,
      `ipaddr` varchar(128) CHARACTER SET latin1 DEFAULT NULL,
      `interface` varchar(256) CHARACTER SET latin1 DEFAULT NULL,
      `qos_in_enable` int(4) DEFAULT NULL,
      `qos_out_enable` int(4) DEFAULT NULL,
      `bw_in` bigint(20) DEFAULT NULL,
      `bw_out` bigint(20) DEFAULT NULL,
      `uptime` int(20) DEFAULT '0',
      `clock` int(20) DEFAULT '0',
      KEY `t1` (`host`,`clock`,`ipaddr`),
      KEY `t2` (`host`,`clock`,`username`),
      KEY `auth_users` (`clock`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;*
    
  4. 禁用键:

    ALTER TABLE pppoe_auth_users DISABLE KEYS;
    
  5. 插入所需时间片的数据,本例中为过去 60 天:

    insert into pppoe_auth_users (select * from pppoe_auth_users_tmp where clock>=(unix_timestamp()-(86400*60)));
    
  6. 启用键:

    ALTER TABLE pppoe_auth_users ENABLE KEYS;
    
  7. 如果需要,删除旧数据:

    drop table pppoe_auth_users_tmp;
    

相关内容