表空洞是什么
当你对InnoDB进行修改操作时,例如删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除了,因而空间也没有真的被释放回收。
InnoDB的Purge线程会异步的来清理这些没用的索引键和行,但是依然没有把这些释放出来的空间还给操作系统重新使用,因而会导致页面中存在很多空洞。
如果表结构中包含动态长度字段,那么这些空洞甚至可能不能被InnoDB重新用来存新的行,因为空间空间长度不足。
有些用户可能会使用 OPTIMIZE TABLE 或者 ALTER TABLE <table> ENGINE=InnoDB 来重建这些表,但是这样会导致表的拷贝,如果临时空间不足甚至不足以进行一次 OPTIMIZE TABLE 操作。并且如果你用的是共享表空间方式,OPTIMIZE TABLE 会导致你的共享表空间文件持续增大,因为整理的索引和数据都追加在数据文件的末尾。
InnoDB类型的表是无法使用optimize table命令
有什么影响
1. 删除数据时,空间并没有变小,
2. mysql对数据库扫描时,扫描的对象实际是列表的容量上限,会降低扫描效率
如何查看表空洞大小
代码块
sql
SELECT DATA_LENGTH,DATA_FREE from information_schema.tables where table_schema='test' and table_name='t1';
DATA_FREE表示表中空闲数据块的大小。
如何清理空洞(效率慢,谨慎使用)
1. myisam 可以使用 optimize table table_name 命令进行碎片整理,去除空洞,会锁表(innodb无法使用optimize)
2. 使用 alter table table_name engine=innodb ,可以释放空洞,这是由于在转换数据引擎(即使没有真正转换)的时候,会将表中的所有数据读取,再重新写入,这个过程中,会释放空洞(效率慢)