一:数据碎片化原因
Mysql引擎不同,碎片化的原因也有所差别。
在InnoDB中,了,因而空间也没有真的被释放回收。
1:删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除,所以就没能释放回收。InnoDB的 Purge线程会异步的来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操作系统重新使用,因而会导致页面中存在很多空洞。如果表结构中包含动态长度字段,那么这些空洞甚至可能不能被InnoDB重新用来存新的行,因为空间空间长度不足
2:大量的随机 delete 操作,在数据文件中造成不连续的空白空间。而当插入数据时,这些空白空间则会利用起来,于是造成了数据的存储位置不连续。物理存储顺序与逻辑上的排序顺序不同,这种就是数据碎片
3:对于大量的UPDATE,也会产生文件碎片化 , Innodb的最小物理存储分配单位是页(page),而UPDATE也可能导致页分裂(page split),频繁的页分裂,页会变得稀疏,并且被不规则的填充,所以最终数据会有碎片
二:数据碎片化类型
1:行碎片(Row fragmentation)
指的是数据行被存储为多个地方的多个片段。即使查询只从索引中访问一行记录。行碎片也会导致性能下降。
2:行间碎片(Intra-row fragmentaion)
行间碎片是指逻辑上顺序的页,或者行在磁盘上不是顺序存储的。行间碎片对诸如全表扫描和聚簇索引扫描之类的操作有很大的影响,因为这些操作原本能够从磁盘上顺序存储的数据中获益。
3&#x