innodb_file_per_table参数(此参数在分区表章节中还会出现):
一个表单独存储为一个文件更容易管理,而且在你不需要这个表的时候,通过 drop table 命令,系统就会直接删除这个文件。而如果是放在共享表空间中,即使表删掉了,空间也是不会回收的。所以参数推荐为ON。
空洞的产生:
重建表的方法:
使用ALTER TABLE
命令:
这是最常用的重建表的方法。通过指定ENGINE=InnoDB
,你可以让MySQL重新创建表的物理存储。这个过程会创建一个新的临时表,将原表中的数据按主键ID递增顺序导入新表,然后删除原表并将新表重命名为原表的名字。例如:
ALTER TABLE table_name ENGINE=InnoDB;
在MySQL 5.6及更高版本中,这个过程通常是Online的,也就是说,在重建表的过程中,可以继续对表进行增删改操作。
使用OPTIMIZE TABLE
命令:
这个命令是ALTER TABLE ... ENGINE=InnoDB
的别名,它会尝试优化表的存储。在某些情况下,这可能意味着重建表,但行为可能因MySQL版本和表的具体情况而异。例如:
OPTIMIZE TABLE table_name;
这个命令在执行时会获取表级锁,可能会影响业务操作。
使用ALTER TABLE ... ALGORITHM=COPY
:
当你需要强制执行一个非在线的表重建时,可以使用这个选项。这会导致MySQL创建一个新表,并将数据从原表复制到新表中,然后删除原表并重新命名新表。例如:
ALTER TABLE table_name ALGORITHM=COPY;
这种方式不是在线的,可能会对业务操作产生影响。
使用gh-ost
工具:
gh-ost
(GitHub开源的在线DDL工具)来进行表重建。gh-ost
允许你在不锁定整个表的情况下进行DDL操作,从而减少对业务的影响。使用ANALYZE TABLE
命令:
虽然这个命令不会重建表,但它可以更新表的索引统计信息,有助于优化查询性能。例如:
ANALYZE TABLE table_name;
这个操作通常很快,并且对业务操作的影响很小。
在进行表重建操作时,需要考虑操作对业务的影响。Online DDL方法(如ALTER TABLE
和OPTIMIZE TABLE
)通常更适合生产环境,因为它们允许在重建过程中继续进行业务操作。对于大型表,应该在业务低峰期进行操作,并考虑使用gh-ost
等工具来最小化对业务的影响。同时,确保在执行这些操作之前备份数据,以防万一出现问题。
知识整理与创作不易,感谢大家理解与支持!