在 InnoDB 数据库引擎中,执行 DELETE 操作并非真正删除数据,而是给数据打上删除标记。这表示表空间大小不会因删除操作而减少,即为假删除。我们通过一个例子验证这一结论。创建存储过程,插入10万条数据,查看占用空间。10万条数据占3.52M,执行 DELETE 后,表空间大小不变,证实了删除操作仅标记数据...
mysql删除操作其实是假删除
在 InnoDB 数据库引擎中,执行 DELETE 操作并非真正删除数据,而是给数据打上删除标记。这表示表空间大小不会因删除操作而减少,即为假删除。我们通过一个例子验证这一结论。创建存储过程,插入10万条数据,查看占用空间。10万条数据占3.52M,执行 DELETE 后,表空间大小不变,证实了删除操作仅标记数据,未实际移除。
标记删除的数据可复用。例如,在特定记录中删除一条,其位置被标记,下次插入符合条件记录时可复用该位置。数据页全部标记删除后,整个页可复用,插入限制少于行记录复用。插入记录与被标记位置不匹配时,数据页复用提供可能。标记删除形成数据空洞,浪费空间并影响查询效率。每次磁盘访问对应IO操作,空洞增加IO次数,降低查询速度。插入和更新操作同样产生空洞,影响表性能。
频繁增删改操作导致数据空洞,占用更多空间,降低查询效率,表现为查询速度变慢。解决方法是重建表,建立临时表,将数据重新插入,替换原表。重建过程可释放表空间,减少空洞影响。使用重建命令可以达到相同效果,推荐实践验证。InnoDB 引擎下,其他数据库引擎可能有不同表现。2024-10-16