为什么 MySQL 回滚事务也会导致 ibd 文件增大?_MySQL

php中文网
发布: 2016-05-27 13:46:19
原创
2143人浏览过

一个简单的测试: 

 

start transaction;

insert into tb1 values(3, repeat('a', 65000),'x',1);

--commit;

rollback;

 

下图分别是 tb1.ibd 在插入前,回滚前,回滚后的文件大小:

 

有人在QQ群问:为什么回滚会导致tb1.idb的磁盘空间增大?

 

首先:131072-98304=163840-131072=32768

 

这里要存储 65000 个字符'a' ,那么字段类型应该是 text. 而 text 字段的处理是很特别的:

 

Each BLOB or TEXT value is represented internally by a separately allocated object. This is in contrast

to all other data types, for which storage is allocated once per column when the table is opened.

也就是说对于 text/blob 字段来说,它们是另外分配了一个专门的对象来存储,对它们的处理不会在内存中进行缓存,而是直接写入磁盘中。所以未提交时,就可以看到 tb1.idb 发生了增长。

 

而对于 insert 操作的 rollback,那么必须将之前插入的数据进行 delete 操作,而 delete 操作是逻辑操作,也就是设置一个标志位就行了,于是又分配了一个专门的对象来存储这个设置了删除标志的对象。于是磁盘空间增长了两次(暂时只能这么解释了...),每次都是 32768字节(2的15次方)。一旦提交或者rollback,磁盘空间就可以被回收。

 

为什么是 32768呢?

 

text的最大存储空间是 65656 个字节,每次分配的最小单位是 32768字节。

西语写作助手
西语写作助手

西语助手旗下的AI智能写作平台,支持西语语法纠错润色、论文批改写作

西语写作助手 21
查看详情 西语写作助手

 

也就是 insert 和 rollback 都导致了一次 text 字段磁盘空间的增长分配,而分配的最小单位是32768.

 

如何你将  repeat('a',65000) 换成:  repeat('a',65535) 在进行测试,你会发现,insert 时,tb1.idb会增长65536,在执行rollback时也会导致 tb1.idb 再次增长32768。

 

所以应该是 rollback 会导致 text 字段另外分配一次空间,而分配的最小单位是32768。可能和 text 字段的存储结构有关系。这个需要看源码了。

 

测试表明,其它非 text 字段的 rollback 操作,不会导致 ibd 文件增大。

 

测试建表语句如下:

 

mysql> show create table tb1\G

*************************** 1. row ***************************

       Table: tb1

Create Table: CREATE TABLE `tb1` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `webtext` text COLLATE utf8mb4_bin,

  `tp` varchar(2) COLLATE utf8mb4_bin DEFAULT NULL,

  `se` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

1 row in set (0.00 sec)

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号