MySQL 索引重建
MySQL 索引重建
当你对InnoDB进行修改操作时,例如删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除了,因而空间也没有真的被释放回收。
InnoDB的Purge线程会异步的来清理这些没用的索引键和行,但是依然没有把这些释放出来的空间还给操作系统重新使用,因而会导致页面中存在很多空洞。
如果表结构中包含动态长度字段,那么这些空洞甚至可能不能被InnoDB重新用来存新的行,因为空间空间长度不足。
有些用户可能会使用 OPTIMIZE TABLE 或者 ALTER TABLE <table> ENGINE=InnoDB 来重建这些表,但是这样会导致表的拷贝,如果临时空间不足甚至不足以进行一次 OPTIMIZE TABLE 操作。
并且如果你用的是共享表空间方式,OPTIMIZE TABLE 会导致你的共享表空间文件持续增大,因为整理的索引和数据都追加在数据文件的末尾。
InnoDB类型的表是无法使用optimize table命令
## 重新索引k
一、
alter table T drop index k;
alter table T add index(k);
## 重建主键索引
一、
alter table T drop primary key;
alter table T add primary key(id);
二、
alter table T engine=InnoDB;
可以释放空洞,这是由于在转换数据引擎(即使没有真正转换)的时候,会将表中的所有数据读取,再重新写入,这个过程中,会释放空洞(效率慢)