MySQL实战 | 13 为什么表数据删掉一半,表文件大小不变?

经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?

InnoDB 表的组成:表结构定义和数据。

数据删除流程

InnoDB 中,数据是以 B+ 树结构来存储数据的:

image

假设删掉表记录 R4,此时 InnoDB 只是把 R4 标记为已删除状态,后续这个位置可以插入新的数据,但是磁盘文件大小并不会变化。

何时复用?

比如,插入一个 ID 是 400 的记录,就可以直接复用原来 R4 的空间,若插入的是 800,为了保持 B+ 树的结构,就不能复用该空间了。

删除整页数据

当删除了整页数据后,InnoDB 会将该页标记为已删除,整页都可复用。

同时,若两个相邻的数据页利用率都比较低,系统会把两页上的数据整合到一个页中,另一个页就会标记为可复用。

删除整个表

此时,所有的数据页都会标记为可复用,但是磁盘空间仍然不会变小。

总结

delete 操作,只是把记录的位置标记为「可复用」,但是磁盘大小不会变化,这些可以复用,而未被使用的空间,看起来就像空洞

增删改-造成空洞

当数据是随机插入时,就可能造成索引的数据页分裂。

image

如图所示,由于 page A 写满,此时插入 ID 为 550 的数据,就不得不申请新的数据页,页分裂完成后,A 上就会留下空洞。

另外,更新索引上的值,其实是删除旧值,插入新值,这个过程同样会造成空洞。

综上,经过大量增删改操作的表,都是可能存在大量空洞的,若要收缩表空间,就要清除这些空洞。

重建表-清除空洞

如何清除空洞?

直接的想法就是,新建一个表结构相同的表,然后按主键 ID 递增的顺序,将原表中的数据,插入到新表。

这样,新表中就不会存在空洞了。新表的主键索引也会更加紧凑,数据页的利用率也更高。

上面的操作可以通过下面的语句自动完成:

alter table A engine=InnoDB;

MySQL 会自动完成转存数据、交换表名、删除旧表的操作。

image

详细流程:

1、新建临时文件,扫描原表 A 的所有数据页;
2、根据表 A 的记录生成 B+ 树,存储到临时文件中;
3、生成临时文件过程中,对 A 的所有操作都会记录在一个日志文件中,对应图中的 state2 状态;
4、临时文件生成后,将日志文件中的操作应用于临时文件,得到一个完整的数据文件,对于 state3;
5、用临时文件替换表 A 的数据文件;

表重建的过程是允许对表 A 做增删改操作的,因此是一个 Online DDL(MySQL5.6+)

另外,根据表 A 重建出来的数据是放在“tmp_file”里的,这个临时文件是 InnoDB 在内部创建出来的。整个 DDL 过程都在 InnoDB 内部完成。对于 server 层来说,没有把数据挪动到临时表,是一个“原地”操作,这就是“inplace”名称的来源。

上述的这些重建方法都会扫描原表数据和构建临时文件。对于很大的表来说,这个操作是很消耗 IO 和 CPU 资源的。

因此,如果是线上服务,你要很小心地控制操作时间。如果想要比较安全的操作的话,我推荐你使用 GitHub 开源的 gh-ost 来做。


你的关注是对我最大的鼓励!

关注本公众号,后台回复「2018」即可获取传智播客 2018 最新 Python 和 Java 教程。

公众号提供CSDN资源免费下载服务!


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容