这里先说结论,alter table语句可以触发表重建,消除碎片空间。
mysql中的数据存储结构大概是下面这个样子的
而delete掉的标记会记录在头信息中。
做个实验,看看空间是否真的没有释放;
创建一张表user,并插入很多数据
查看表的文件大小
再随便插入几条
ok这里看到文件大小增加了16k,这是因为mysql的一页就是16k,所以文件大小是16k、16k的增长的。
这时候我们删除大量的数据再次查看文件大小,仍然是272k,索命,数据虽然删除,但是空间没有释放。
这里我们对主键执行一个alter table语句
再次查看文件大小
ok 文件大小明显的减少,这里说明主键的alter语句会重建表,并且释放碎片空间;
这时候我们再删除大量的数据再次查看文件大小,这里我们对普通列执行一个alter table语句
再次查看文件大小
ok 文件大小明显的减少,这里说明普通列的alter语句会重建表,并且释放碎片空间;
删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,这种是数据碎片.实际上数据碎片分为两种,一种是单行数据碎片,另一种是多行数据碎片.前者的意思就是一行数据,被分成N个片段,存储在N个位置.后者的就是多行数据并未按照逻辑上的顺序排列.当有大量的删除和插入 *** 作时,必然会产生很多未使用的空白空间,这些空间就是多出来的额外空间.索引也是文件数据,所以也会产生索引碎片,理由同上,大概就是顺序紊乱的问题.Engine 不同,OPTIMIZE 的 *** 作也不一样的,MyISAM 因为索引和数据是分开的,所以 OPTIMIZE 可以整理数据文件,并重排索引。这样不但会浪费空间,并且查询速度也更慢。
查看碎片信息:
Index_length 代表索引的总量
Data_free 代表碎片数量
从information_schema中获取信息:
碎片整理:
过程时间长短取决于表大小和碎片多少,
返回结果optimize status OK则整理完成;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)