前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL 塞进去的吐不出来,磁盘空间浪费了吗?

MYSQL 塞进去的吐不出来,磁盘空间浪费了吗?

作者头像
AustinDatabases
发布2020-06-01 17:11:11
4430
发布2020-06-01 17:11:11
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

问题是这样产生的,有一个同学问一次性操作(big transaction)对数据库有什么不好的地方,当然可以从很多地方来切入,某些BT 对数据库的操作中的影响。

今天想从另一个方式来切入,看看BT对于数据库有什么不好的影响,这次我们从数据库的存储方面来切入,这个点一般来说对于BT 来说,鲜有人来从这个点来证明BT对于数据库的不良的影响。

我们下面做一个 testing, 方法很简单,你先要生成一个比较大的表,然后借用这张表来证明一些事情。

测试的表

CREATE TABLE `test` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`name` varchar(20) NOT NULL,

`age` smallint(6) NOT NULL,

`work_years` smallint(6) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=162405 DEFAULT CHARSET=utf8 COMMENT='test'

拥有16万条记录的表,他占用了大约12MB的磁盘空间,当然这都不是今天要说的问题

我们下面来做这个实验

我们新生成一个表和test一样,名字叫 disk_space ,并且将test 的数据灌入到disk_space中,当然这在一个事务里面,并且一个10万条的数据操作在一个事务里面,不少developers 觉得这并不是一个问题。

然后我们将事务回滚rollback,当然数据库很听话,数据已经回滚,从上图看,我们并没有任何数据在disk_space表里面。

那我们翻过来看一下存储空间,按照原理来说我并不是 insert ---> delete 操作,按照想的,我的磁盘空间也不应该有存储。

但实际上,disk_space 占用了和test表一样的数据存储空间,并且不再释放。除非你用其他的方式来让他“吐出骨头”。

有人说,那要是我不rollback,我kill 这个事务呢,在commit之前。

我们还是做这个实验,但我们不rollback,也不commit 我们在操作完毕后,查出他的thread_id ,然后kill 这个session,从下图看,当前操作的事务session 是 76 .

将这个76 号的session kill 掉

我们再看,磁盘的空间还是会被占用。上图已经说明,空间还是会被占用。

通过上面的过程,可以证明如果运行BT的过程,并且是DML 的操作,则很可能会出现磁盘空间被浪费从系统的层面。

实际上这些空间还是会被重新利用的。

所以从上面的例子,看

尽量将DML 的事务变得小一点,至少这样有利于减少系统磁盘空间的浪费,尤其在事务失败,或者回滚的情形下,当然回滚的时间也会缩短,避免产生更多的锁,影响系统的性能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档