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;
可以釋放空洞,這是由於在轉換數據引擎(即使沒有真正轉換)的時候,會將表中的所有數據讀取,再重新寫入,這個過程中,會釋放空洞(效率慢)