在InnoDB中,删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除了,因而空间也没有真的被释放回收。InnoDB的Purge线程会异步的来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操作系统重新使用,因而会导致页面中存在很多空洞。
行碎片(Row fragmentation)
这种碎片指的是数据行被存储为多个地方的多个片段。即使查询只从索引中访问一行记录。行碎片也会导致性能下降。
行间碎片(Intra-row fragmentaion)
行间碎片是指逻辑上顺序的页,或者行在磁盘上不是顺序存储的。行间碎片对诸如全表扫描和聚簇索引扫描之类的操作有很大的影响,因为这些操作原本能够从磁盘上顺序存储的数据中获益。
剩余空间碎片(Free space fragmentation)
剩余空间碎片是指数据页中有大量的空余空间。这会导致服务器读取大量不需要的数据。从而造成浪费。
对于MyISAM表,这三类碎片化都有可能发生。但InnoDB不会出现短小的行碎片;InnoDb会移动短小的行并重写到一个片段中。
那怎么处理行碎片呢?
处理方法 :
定期进行碎片整理(alter table xxx engin=innodb(修改存储引擎为innodb)) innodb存储引擎使用 优势:比较方便 劣势: 代价高 会锁表,碎片整理能力有限
将数据导出,删除原来数据再进行导入 风险高
将根据原来删除条件进行分区表,业务变为truncate,降低碎片的产生,定期整理碎片