首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在MySQL上删除表的某些行后,我的空闲磁盘空间会减少?

在MySQL上删除表的某些行后,空闲磁盘空间减少的原因是由于MySQL的存储引擎和表的组织方式导致的。

MySQL使用的存储引擎有多种,其中最常用的是InnoDB和MyISAM。在InnoDB存储引擎中,表的数据是按照主键的顺序组织的,而不是按照插入的顺序。当删除表的某些行后,InnoDB会将这些行标记为已删除,但并不会立即释放磁盘空间。相反,它会将这些空闲的空间保留在表中,以便将来插入新的数据时可以重用这些空间,从而提高性能。因此,即使删除了表的某些行,磁盘空间并不会立即释放。

另外,MySQL的存储引擎还使用了一种称为“回滚段”的机制来支持事务的回滚操作。当删除表的某些行时,MySQL会将这些被删除的行的副本保存在回滚段中,以便在事务回滚时可以恢复数据。这也会占用一定的磁盘空间。

如果你希望立即释放磁盘空间,可以使用MySQL的OPTIMIZE TABLE命令来重建表。这个命令会创建一个新的表,并将未被删除的行复制到新表中,然后删除旧表。这样可以消除已删除行的磁盘空间占用,并且可以进一步优化表的性能。

推荐的腾讯云相关产品:腾讯云数据库MySQL,产品介绍链接地址:https://cloud.tencent.com/product/cdb_mysql

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day4】 —— 数据库1

多表关联查询时,小在前,大在后   MySQL中,执行 from 关联查询是从左往右执行(Oracle相反),第一张涉及到全扫描,所以将小放在前面,先扫小,扫描快效率较高,扫描后面的大...,mysql 实际只是给删除数据打了个标记为已删除,因此 delete 删除数据时,文件磁盘上所占空间不会变小,存储空间不会被释放,只是把删除数据设置为不可见。...DELETE执行时,先将所删除数据缓存到rollback segement中,事务commit之后生效; delete from table_name删除全部数据,对于MyISAM 立刻释放磁盘空间...delete 操作是一执行删除,并且同时将该行删除操作日志记录在redo和undo空间中以便进行回滚(rollback)和重做操作,生成大量日志也会占用磁盘空间。...实质重启auto_increment从 SELECT 1+MAX(ai_col) FROM t 开始。

38220

讲讲MySQL删除

deleteMark是开启的话,那么依然返回空,因为这个细节,所以经常会出现“明明删除了数据,为什么空间没释放”现象。...15M 7 6 18:46 user_info.ibd #删除前 15M 10 4 16:47 user_info.ibd #删除 为什么不直接删除,而是打个标记 只是打个标记的话,岂不是很浪费空间...,由于要求数据连续性,数据5必须在数据4和数据6之间,那么只能新建一个页,新建一个页尝试从pageA中移动一部分数据到新,并且重新组织页与页之间关系,即在pageA和pageB之间隔一道新页...手动重建 重建不一定会收缩空间 重建过程中,有一点需要知道:InnoDB不会让重建页充满数据,预留个「1/16」空间,这个意图很明显,如果不预留,选择占满整个页,这时候去更新一条需要更大空间老数据...但是因为这个预留操作,某些情况下导致重建空间反而会变大。 如果你本身就很紧凑,因为预留1/16变大。

2.9K20

干货|分析PostgreSql单60w数据却占用55g空间

) 简单了解之下只是看到一些博客说pg保留更新删除数据MVCC版本记录数据,完了又看到官网解释:   `简单 VACUUM(不带FULL)简单地收回空间并使其可以被重用。...,紧接着继续研究为什么产生这么多空间,虽然细细研究之下发现官网一句特别的提示:   `24.1.2....恢复磁盘空间 PostgreSQL中,一次UPDATE或DELETE不会立即移除该行旧版本。...,这就是说为什么理论,不存在彻底删除,除非你把磁盘填满之后重新覆盖),可以被之后新记录覆盖,对于急着释放空间页面请求又不是特别多情况下还是需要vacuum full来紧急释放空间,另外官网也不建议频繁...vacuum full来代替vacuum毕竟,况且使用vacuum full锁住整个,之前预发布环境中,也整整执行了6分钟,这是非常不理想,万一用户使用呢这就很不友好了,况且版本记录有时候还是有用

64950

SQL索引优缺点

2:数据修改时,例如增加,删除,更新,都需要维护索引,这是需要系统开销。 3:不合理索引设计非但不能利于系统,反而会使系统性能下降。...学生包含了100000记录,而且学分是随机生成,这样从数据量以及数据分布都有一定保障。 第一种情况:学生有索引。...因为出现了范围查找,如果一个索引一个索引比较,性能上比起直接按聚集索引查找全部数据再过滤来差。那学分索引什么时候 SQL优先考虑呢?...不对数据进行更改时(例如只读中)才用此设置,实用价值不大。值越小则数据页空闲空间越大,可以减少索引增长过程中进行页分裂,但需要占用更多硬盘空间。...2:不要设置过多索引,没有聚集索引中,最大可以设置249个非聚集索引,过多索引首先会带来更大磁盘空间,而且在数据发生修改时,对索引维护是特别消耗性能

1.2K10

MySQL 总结char与varchar区别

当检索到char值时,尾部空格被删除掉。存储或检索过程中不进行大小写转换,char存储定长数据很方便,char字段索引效率很高。...,检索时char类型空格被删掉,而不会删除varchar类型空格 MySQL数据库中,用最多字符型数据类型就是VARCHAR和CHAR。...利用这个选项来创建MyISAM的话,系统将会为每一使用固定长度空间,此时会造成存储空间损耗。 通常情况下,VARCHAR数据类型能够节约磁盘空间,因此往往认为其能够提升数据库性能。...适用情况: 对于MyISAM,尽量使用CHAR,对于那些经常需要修改而容易形成碎片数据就更是如此,它缺点就是占用磁盘空间; 对于InnoDB,因为它数据行内部存储格式对固定长度数据和可变长度数据不加区分...事实,因为char类型通常要比varchar类型占用更多空间,所以从减少空间占用量和减少磁盘i/o角度,使用varchar类型反而更有利; 存储很短信息,比如门牌号码101,201……这样很短信息应该用

22040

delete、truncate、drop,千万别用错了。。

上周同事小姐姐问我:“哥你看,发现MySQL有bug,下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??” 那你是怎么删除?...,走事务,执行时会触发trigger; 2、 InnoDB 中,DELETE其实并不会真的把数据删除mysql 实际只是给删除数据打了个标记为已删除,因此 delete 删除数据时,文件磁盘上所占空间不会变小...3、DELETE执行时,先将所删除数据缓存到rollback segement中,事务commit之后生效; 4、delete from table_name删除全部数据,对于MyISAM 立刻释放磁盘空间...7、delete 操作是一执行删除,并且同时将该行删除操作日志记录在redo和undo空间中以便进行回滚(rollback)和重做操作,生成大量日志也会占用磁盘空间。...实质重启auto_increment从 SELECT 1+MAX(ai_col) FROM t 开始。 4、小心使用 truncate,尤其没有备份时候。

8610

教同事小姐姐删除MySQL数据几种姿势

过一会儿来到小姐姐工位,她说:“哈哥你看,发现MySQL有bug,下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??” 那你是怎么删除?...,走事务,执行时会触发trigger; 2、 InnoDB 中,DELETE其实并不会真的把数据删除mysql 实际只是给删除数据打了个标记为已删除,因此 delete 删除数据时,文件磁盘上所占空间不会变小...7、delete 操作是一执行删除,并且同时将该行删除操作日志记录在redo和undo空间中以便进行回滚(rollback)和重做操作,生成大量日志也会占用磁盘空间。...实质重启auto_increment从 SELECT 1+MAX(ai_col) FROM t 开始。...3、小心使用 drop ,要删跑路兄弟,请在订票成功执行操作!

46420

MySQL 数据库锁定机制

MySQL 锁定机制简介 各存储引擎使用三种类型锁定机制 级锁定(row-level) 级锁定(table-level) 页级锁定(page-leve) : 页级锁定介于级锁定与级锁定之间...通过索引实现锁定方式存在其他几个较大性能隐患: 当 Query 无法利用索引时候,InnoDB 放弃使用 级锁定 而改用 级锁定 ,造成并发性能降低; 当 Query 使用索引并不包含所有过滤条件时...分离能并行操作 concurrent_insert = 2,无论 MyISAM 存储引擎数据文件中间部分是否存在因为删除数据而留下空闲空间,都允许在数据文件尾部进行Concurrent Insert...concurrent_insert = 0, 无论 MyISAM 存储引擎数据文件中间部分是否存在因为删除数据而留下空闲空间,都不允许 Concurrent Insert。...InnoDB 锁优化建议 尽可能让所有的数据检索都通过索引来完成,从而避免 InnoDB 因为无法通过索引键加锁而升级为级锁定 合理设计索引,让 InnoDB 索引键加锁时候尽可能准确,尽可能地缩小锁定范围

2.2K160

MySQL 数据库锁定机制

MySQL 锁定机制简介 各存储引擎使用三种类型锁定机制 级锁定(row-level) 级锁定(table-level) 页级锁定(page-leve) : 页级锁定介于级锁定与级锁定之间...通过索引实现锁定方式存在其他几个较大性能隐患: 当 Query 无法利用索引时候,InnoDB 放弃使用 级锁定 而改用 级锁定 ,造成并发性能降低; 当 Query 使用索引并不包含所有过滤条件时...分离能并行操作 concurrent_insert = 2,无论 MyISAM 存储引擎数据文件中间部分是否存在因为删除数据而留下空闲空间,都允许在数据文件尾部进行Concurrent Insert...concurrent_insert = 0, 无论 MyISAM 存储引擎数据文件中间部分是否存在因为删除数据而留下空闲空间,都不允许 Concurrent Insert。...InnoDB 锁优化建议 尽可能让所有的数据检索都通过索引来完成,从而避免 InnoDB 因为无法通过索引键加锁而升级为级锁定 合理设计索引,让 InnoDB 索引键加锁时候尽可能准确,尽可能地缩小锁定范围

1.2K20

delete、truncate、drop区别有哪些,该如何选择

trigger; 2、 InnoDB 中,DELETE其实并不会真的把数据删除mysql 实际只是给删除数据打了个标记为已删除,因此 delete 删除数据时,文件磁盘上所占空间不会变小...3、DELETE执行时,先将所删除数据缓存到rollback segement中,事务commit之后生效; 4、delete from table_name删除全部数据,对于MyISAM 立刻释放磁盘空间...7、delete 操作是一执行删除,并且同时将该行删除操作日志记录在redo和undo空间中以便进行回滚(rollback)和重做操作,生成大量日志也会占用磁盘空间。...实质重启auto_increment从 SELECT 1+MAX(ai_col) FROM t 开始。...3、小心使用 drop ,要删跑路兄弟,请在订票成功执行操作!

41420

delete、truncate、drop区别有哪些,该如何选择

上周同事小姐姐问我:“哈哥你看,发现MySQL有bug,下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??” 那你是怎么删除?...,走事务,执行时会触发trigger; 2、 InnoDB 中,DELETE其实并不会真的把数据删除mysql 实际只是给删除数据打了个标记为已删除,因此 delete 删除数据时,文件磁盘上所占空间不会变小...7、delete 操作是一执行删除,并且同时将该行删除操作日志记录在redo和undo空间中以便进行回滚(rollback)和重做操作,生成大量日志也会占用磁盘空间。...实质重启auto_increment从 SELECT 1+MAX(ai_col) FROM t 开始。...3、小心使用 drop ,要删跑路兄弟,请在订票成功执行操作!

1.2K00

delete 加 limit 是个好习惯么?!

这样,删除执行中,第一条就命中了删除,如果SQL中有限制1;这时就return了,否则将会执行完全扫描才ret urn。效率不言而喻。 那么,日常执行删除时,我们是否需要养成加极限习惯呢?...立即立即释放删除磁盘空间,并重置auto_increment值。...删除删除不释放磁盘空间,但后续插入会覆盖之前删除数据。...避免了长事务,删除执行时MySQL重置所有涉及加写锁和Gap锁(间隙锁),所有DML语句执行相关行会被锁住,如果删除数量大,直接影响相关业务无法使用。 \3。...---- 对于删除限制使用,MySQL大佬丁奇有些道题: 如果您要删除一个表里面的前10000数据,有以下三种方法可以做到:第一种,直接执行第二种,一个连接中循环执行20次从T限制500中删除;第三种

1.1K71

面试官灵魂一问: MySQL delete、truncate、drop 有什么区别?

MySQL有bug,下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??”...,走事务,执行时会触发trigger; 2、 InnoDB 中,DELETE其实并不会真的把数据删除mysql 实际只是给删除数据打了个标记为已删除,因此 delete 删除数据时,文件磁盘上所占空间不会变小...7、delete 操作是一执行删除,并且同时将该行删除操作日志记录在redo和undo空间中以便进行回滚(rollback)和重做操作,生成大量日志也会占用磁盘空间。...实质重启auto_increment从 SELECT 1+MAX(ai_col) FROM t 开始。...3、 小心使用 drop ,要删跑路兄弟,请在订票成功执行操作!

1K20

MySQL内存结构与物理结构

UserRecords中存放就是数据记录。Free Space存放空闲空间,被删除行会被记录成空闲空间。Page Directory记录着与二叉查找相关信息。...show variables like 'innodb_data%' 共享空间还有一个问题是,无法通过删除数据文件方式,来减少空间大小,只能通过 mysqldump 工具备份所有数据,再删除所有空间数据...独立空间则没有这个问题,可以实现单不同数据库中移动,性能也更高一些。...磁盘上,change buffer是系统空间一部分,以便数据库重启缓存索引变更可以继续被缓存 自适应哈希索引是InnoDB通过在内存中构造一个哈希索引来加速查询优化技术,此优化只针对使用...完成doublewrite页写入之后,再将内存doublewrite buffer中页写入到自己空间文件。

8K20

单台 MySQL 支撑不了这么多并发请求,我们该怎么办?

但实现分布式读就相对简单很多,只需要增加一些只读实例,只要能够把数据实时同步到这些只读实例,保证这这些只读实例数据都随时一样,这些只读实例就可以分担大量查询请求。...但即使这个非常小延迟,也导致某一个时刻,主库和从库数据是不一致。应用程序需要能接受并克服这种主从不一致情况,否则就会引发一些由于主从延迟导致数据错误。...清理过程中需要对原数据删除,但是删除了大量数据,如果你检查一下 MySQL 占用磁盘空间,你会发现它占用磁盘空间并没有变小,这是什么原因呢?其实和 InnoDB 物理存储结构有关系。...当 MySQL 删除一条记录时候,只能是找到记录所在文件中位置,然后把文件这块区域标记为空闲,然后再修改 B+ 树中相关一些指针,完成删除。...重建过程中,索引也重建,这样数据和索引数据都会更紧凑,不仅占用磁盘空间更小,查询效率也会有提升。 4、分库分 数据库性能取决于两个因素:查找时间复杂度、数据量大小。

2.1K20

MVCC Postgresql 和 MYSQL 到底谁更......?

这将分配给回滚段页面标记为空闲,并减少回滚逻辑大小。...数据库如果在执行事务过程中想要回滚,必然要考虑并发和回滚,这就造成随着并发和回滚需求,导致占用更多磁盘空间,而在事务提交就需要清理掉这些无用东西,POSTGRESQL 叫 VACUUM ,MYSQL...叫 Purge ,InnoDB中,更新最新版本只保留在中。...旧版本行在回滚段,而删除版本则保留在原处,并标记为以后清理。因此,须从本身清理标记任何已删除,并从回滚段中清除任何更新旧版本。查找被删除记录所需所有信息。...postgresql 使用中要给出磁盘空间要有余量,mysql 在这方面上要好一些。

1.5K51

Percona pt-archiver重构版--大数据归档工具

Percona pt-archiver重构版--大数据归档工具相信很多小伙伴们,日常对接开发时,有很多大在业务并没有采取任何形式切分,数据不停地往一张表里灌入,迟早有一天,磁盘空间报警。...作为一个DBA,侧重点是对数据库操作性能(大增加字段/索引,QPS等)和存储容量加以考虑,我们建议开发对数据库里进行数据归档处理,例如将3个月内订单保留在当前,历史数据切分保存在归档中...,之后归档从主库移走以便腾出磁盘空间,并将其迁移至备份机中(有条件可以将其转换为TokuDB引擎),以便提供大数据部门抽取至HDFS。...7天数据比如说只有10万,那么原直接删除9990万记录,操作成本太高,固需要考虑重构。重构版是这样做,提取你要保留7天数据至临时,然后老表和临时交换名字,这样大大缩减了可用时间。...6、删除三个触发器。

30240

Innodb页合并和页分裂

使用适当主键,设计辅助索引,记住不应滥用它们。您知道插入/删除/更新次数很多添加适当维护窗口。 还有重要一点需要记住。InnoDB中,您不能有碎片记录,否则在页级别上,您会有一个噩梦。...当心批量插入失败或者回滚时带来MySQL碎片 通常,DBA都了解使用DELETE语句产生碎片。大多数情况下,当执行大量删除时,DBA总会重新构建以回收磁盘空间。...但是,您是否认为只有删除才会导致碎片?(答案:并不是)。 在这篇博文中,将解释插入如何带来碎片。...讨论这个主题之前,我们需要了解MySQL,有两种碎片: InnoDB页完全空闲引起碎片。 InnoDB页未填充满(页中还有一些空闲空间)引起碎片。...当插入回滚,"ins_frag"仍然占有相同2GB磁盘空间

2.9K20

重新学习Mysql数据库7:详解MyIsam与InnoDB引擎锁实现

该系列博文告诉你如何从入门到进阶,从sql基本使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间...锁机制是锁,不支持全文索引 Memory:数据是存放在内存中,默认哈希索引,非常适合存储临时数据,服务器关闭,数据丢失掉。...如果对有空洞进行并发插入会产生碎片,所以空闲时可以利用optimize table命令回收因删除记录产生空洞。...锁调度 MyISAM中当一个进程请求某张读锁,而另一个进程同时也请求写锁,Mysql先让后者获得写锁。即使读请求比写请求先到达锁等待队列,写锁也插入到读锁之前。...2、同一个事务中,尽可能做到一次锁定所需要所有资源,减少死锁产生概率; 3、对于非常容易产生死锁业务部分,可以尝试使用升级锁定颗粒度,通过级锁定来减少死锁产生概率;

55130

mysql建索引优点及几大原则

最后,因为索引中存储了实际列值,所以某些查询只使用索引就能够完成全部查询。...4.限制索引数目   索引数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要磁盘空间就越大。修改时,对索引重构和更新很麻烦。...6.删除不再使用或者很少使用索引   数据被大量更新,或者数据使用方式被改变,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作影响。...具体细节依赖于其实现方式,InnoDB聚族索引实际同一个结构中保存了B-Tree索引和数据。当有聚族索引时,它数据存放在索引叶子页中。...除聚簇索引之外每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。

94900
领券