暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
13.为什么表数据删掉一半,表文件大小不变?.pdf
374
11页
3次
2022-06-14
100墨值下载
13 | 为什么表数据删掉一半,表文件大小不变?
2018-12-12 林晓斌
经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表
文件的大小还是没变?
那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题
这里,我们还是针对MySQL中应用最广泛的InnoDB擎展开讨论。一个InnoDB包含两部
分,即:表结构定义和数据。在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里。而
MySQL 8.0版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很
小,所以我们今天主要讨论的是表数据。
接下来,我会先和你说明为什么简单地删除表数据达不到表空间回收的效果,然后再和你介绍正
确回收空间的方法。
innodb_file_per_table
表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数
innodb_file_per_table控制的
1. 这个参数设置为OFF示的是,表的数据放在系统共享表空间,也就是跟数据字典放在
起;
2. 这个参数设置为ON表示的是,每个InnoDB表数据存储在一个以 .ibd后缀的文件中。
heipao8.com Ê×·¢½Ì³ÌÍø
MySQL 5.6.6本开始,它的默认值就是ON
我建议你不论使MySQL哪个版本,都将这个值设置ON。因为,一个表单独存储为一个
件更容易管理,而且在你不需要这个表的时候,通过drop table令,系统就会直接删除这个
件。而如果是放在共享表空间中,即使表删掉了,空间也是不会回收的
所以,innodb_file_per_tableinnodb_file_per_tableONON
我们在删除整个表的时候,可以使drop table令回收表空间。但是,我们遇到的更多的删
数据的场景是删除某些行,这时就遇到了我们文章开头的问题:表中的数据被删除了,但是表空
间却没有被回收
我们要彻底搞明白这个问题的话,就要从数据删除流程说起了
我们先再来看一InnoDB中一个索引的示意图。在前面45篇文章中,我和你介绍索引时
曾经提到过,InnoDB里的数据都是用B+的结构组织的。
1 B+树索引示意图
heipao8.com Ê×·¢½Ì³ÌÍø
of 11
100墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜