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

MySQL表文件在添加索引时变大,但在删除索引时不变小

MySQL表文件在添加索引时会变大,但在删除索引时不会立即变小。这是因为MySQL使用了一种称为B+树的数据结构来存储索引,当添加索引时,B+树会增加新的节点来存储索引信息,从而导致表文件的大小增加。然而,当删除索引时,B+树节点中的索引信息会被标记为无效,但并不会立即释放对应的空间,而是由MySQL的垃圾回收机制在后续的操作中进行清理。

这种设计有以下几个原因:

  1. 提高性能:删除索引时立即释放空间会导致频繁的磁盘操作,影响性能。延迟空间释放可以减少磁盘IO操作,提高系统性能。
  2. 保证数据一致性:如果删除索引时立即释放空间,可能会导致其他正在进行的查询操作出现错误或不一致的情况。延迟空间释放可以确保数据的一致性。
  3. 减少碎片:频繁的索引删除和空间释放会导致磁盘上出现大量的碎片空间,影响磁盘的读写性能。延迟空间释放可以减少碎片的产生。

虽然删除索引时不会立即减小表文件的大小,但可以通过优化表的操作来回收空间。例如,可以使用OPTIMIZE TABLE命令来重建表,这将创建一个新的表文件,并将有效数据复制到新的表中,从而减小表文件的大小。

对于MySQL数据库,腾讯云提供了云数据库MySQL服务(TencentDB for MySQL),它是一种高性能、可扩展、高可用的云数据库解决方案。您可以通过腾讯云官网了解更多关于云数据库MySQL的信息:https://cloud.tencent.com/product/cdb

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

相关·内容

MySQL删除数据,索引文件会不会变小

这篇文章又让我了解到:原来删除数据,的空间是不会释放的... 一张千万级的数据删除了一半的数据,你觉得B+树索引文件会不会变小? 我们先来做个实验,看看表的大小是如何变化的??...索引文件大小约 595 M,最后修改时间 02:17 说明: MySQL 8.0 版本以前,结构是存在以.frm为后缀的文件里 独享空间存储方式使用.ibd文件来存放数据和索引,且每个一个.ibd...MySQL 5.6.6 版本之后,默认是ON,这样,每个 InnoDB 数据存储一个以 .ibd为后缀的文件中。...开始user有1000W条数据,删除若干后,目前剩余约 550W 条 5、删除约500W条记录后,再次查看表文件大小 ?...索引文件大小约 595 M,最后修改时间 10:34 实验结论: 对于千万级的数据存储,删除大量记录后,文件大小并没有随之变小。好奇怪,是什么原因导致的?

2.7K51

面试题:mysql 删除一半数据,B+树索引文件会不会变小???

一张千万级的数据删除了一半的数据,你觉得B+树索引文件会不会变小? ? (答案文章中!!) 我们先来做个实验,看看表的大小是如何变化的??...索引文件大小约 595 M,最后修改时间 02:17 说明: MySQL 8.0 版本以前,结构是存在以.frm为后缀的文件里 独享空间存储方式使用.ibd文件来存放数据和索引,且每个一个.ibd...MySQL 5.6.6 版本之后,默认是ON,这样,每个 InnoDB 数据存储一个以 .ibd为后缀的文件中。...开始user有1000W条数据,删除若干后,目前剩余约 550W 条 5、删除约500W条记录后,再次查看表文件大小 ?...索引文件大小约 595 M,最后修改时间 10:34 实验结论: 对于千万级的数据存储,删除大量记录后,文件大小并没有随之变小。好奇怪,是什么原因导致的?

76650

PostgreSQL 关于字段类型的修改 谣言与止谣

导致Postgres重写的每一行,这可能是一个非常昂贵的操作(就磁盘I/O和挂钟时间而言),MYSQL 早期的版本也没有好到哪里去,可是这对难兄难弟,都会成长。...当然这并不是本期主要的话题,本期的主要话题是 这里要澄清的是,不是所有的PG 的 Alter Column type 操作都要进行重建的操作(这里先牵扯索引的事情) ? ?...2 将上面的变化变回来 将整形从小变大 从大变小,将日期类型进行变化 ?...这些都是需要重写的 说完这些可能还有些人有疑问 1 添加一个字段呢,添加一个带默认值的字段呢 2 删除一个字段呢 3 更改一个字段的名字呢 ?...concurrently 参数则建立索引要 获取一个 access exclusive 的锁,而如果我们使用了 concurrently 则我们会获得一个 share update exclusive

1.8K20

面试官:数据库delete数据,为啥磁盘空间还是被一直占用

Mysql数据结构 凡是使用过mysql,对B+树肯定是有所耳闻的,MySQL InnoDB 中采用了 B+ 树作为存储数据的结构,也就是常说的索引组织,并且数据按照页来存储的。...因此删除数据,会有两种情况: 删除数据页中的某些记录 删除整个数据页的内容 文件大小未更改和mysql设计有关 比如想要删除 R4 这条记录: ?...那怎么才能让大小变小 DELETE只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间,可以使用OPTIMIZE TABLE来回收未使用的空间,并整理数据文件的碎片...相对于copy方式,inplace方式拷贝数据,因此较快。但是这种方式仅支持添加删除索引两种方式,而且与copy方式一样需要全程锁,实用性不是很强。...可以重建的方式,快速将delete数据后的变小(OPTIMIZE TABLE 或ALTER TABLE), 5.6 版本后,创建已经支持 Online 的操作,但最好是在业务低峰使用

1.1K20

面试官问:数据库 delete 数据,磁盘空间还是被一直占用,为什么?

Mysql数据结构 凡是使用过mysql,对B+树肯定是有所耳闻的,MySQL InnoDB 中采用了 B+ 树作为存储数据的结构,也就是常说的索引组织,并且数据按照页来存储的。...因此删除数据,会有两种情况: 删除数据页中的某些记录 删除整个数据页的内容 文件大小未更改和mysql设计有关 比如想要删除 R4 这条记录: InnoDB 直接将 R4 这条记录标记为删除,称为可复用的位置...那怎么才能让大小变小 DELETE只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间,可以使用OPTIMIZE TABLE来回收未使用的空间,并整理数据文件的碎片...相对于copy方式,inplace方式拷贝数据,因此较快。但是这种方式仅支持添加删除索引两种方式,而且与copy方式一样需要全程锁,实用性不是很强。...可以重建的方式,快速将delete数据后的变小(OPTIMIZE TABLE 或ALTER TABLE), 5.6 版本后,创建已经支持 Online 的操作,但最好是在业务低峰使用

63410

MySQL性能优化

另一种是当主要过程要重复访问部分行时,最好将被重复访问的这些行单独形成子集(冗余储存),这在不考虑磁盘空间开销显得十分重要;但在分割以后,增加了维护难度,要用触发器立即更新、或存储过程或应用代码批量更新...垂直分割破坏第三范式):一种是当多个过程频繁访问的不同列,可将垂直分成几个,减少磁盘I/O(每行的数据列少,每页存的数据行就多,相应占用的页就少),更新不必考虑锁,没有冗余数据。...缺点是要在插入或删除数据要考虑数据的完整性,用存储过程维护。...垂直分割可以达到最大化利用Cache的目的。 垂直分割可以使得数据行变小(因为列少了,一行数据就变小),一个数据页就能存放更多数据,查询就会减少I/O 次数。...附慢查询开启方式: mysql安装目录下,找到my.ini配置文件mysqld下加上如下配置: log-slow-queries = C:/Program Files/MySQL/MySQL Server

1.5K30

MongoDB数据存储-深入了解

像数据库添加数据,MongoDB会分配更多的数据文件。每个新数据文件的大小都是上一个已分配文件的两倍(64M->128M->256M),直到预分配文件大小的上限2G。...update(update导致文档的size变大)性能较高;不过MMAPV1lock的并发级别上,支持到collection级别,所以对于同一个collection同时只能有一个write 操作执行...所有的记录在磁盘上连续存储,当一个document尺寸变大,mongodb需要重新分配一个新的记录(旧的record标记删除,新的记record文件尾部重新分配空间),这意味 着mongodb同时还需要更新此文档的索引...Capped支持update,但是我们通常建议,如果更新导致document的尺寸变大,操作将会失败,只能使用in-place update,而且还需要建立合适的索引。...一个database中所有的collections以及索引信息会分散存储多个数据文件中,即mongodb并没有像SQL数据库那样,每个的数据、索引分别存储;数据分块的单位 为extent(范围,区域

5.3K100

面试官:mysql 删除一半数据,空间会变小吗?

TIP:文末福利,记得领取~ 这期面试官提的问题是: MySQL 删除一半数据,空间是否会变小?为什么? 我: 你这么问,肯定是不会?...1.1.1 一些小知识 1、一个 InnoDB 包含结构定义和数据两部分, MySQL 8.0 版本以前,结构是存在以 .frm 为后缀的文件里。...MySQL 5.6.6 版本之后,默认是 ON,也即每个 InnoDB 数据以及索引存储一个以 .ibd 为后缀的文件中。...3、为方便管理建议你设置为 ON,因为当你不需要这个,通过 drop table 命令,系统直接删除这个文件。而如果放在共享空间中,即使删掉了,空间也是不会回收的。...这个命令 5.6 版本以及之后可以考虑在业务低峰期使用的,但在 5.5 及之前的版本,这个命令是会阻塞 DML 的,建议你慎重。 另外,重建都会扫描原数据和构建临时文件

2K30

测试面试题集-MySQL数据库灵魂拷问

MySQL 的隔离等级对加锁有影响,所以分析具体加锁场景,首先要确定当前的隔离等级,分为以下几个等级: 读未提交(Read Uncommitted ,简称 RU):可以读到未提交的读,基本上不会使用该隔离等级...drop:drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器;drop语句删除结构及所有数据,并将所占用的空间全部释放,底层系统文件变小;drop语句将删除的结构所依赖的约束,触发器,...truncate:truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器;truncate会删除空间,底层系统文件变小。...delete:delete是DML,执行delete操作,每次从删除一行,并且同时将该行的的删除操作记录在redo和undo空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大...,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作;delete可根据条件删除中满足条件的数据,如果指定where子句,那么删除中所有记录,只删数据,删除操作后,底层系统文件不会变小

1.1K60

Mysql删除数据,文件大小不变

,因此我今天主要说是数据, 日常开发中,当我们删除一个的的数据的时候,发现空间大小并不会变小,我们要知道为什么会发生这样神奇的事, 参数innodb_file_per_table 数据可以存在共享空间里...,Mysql5.6.6以后默认就是ON 无论使用哪个版本我们都建议把这个值设置成ON,单独放到一个文件,方便管理,当我们不需要这个的时候,通过drop table 就可以直接删除这个文件。...假如我删除500这个数据,innodb只会把这个记录标记为删除,如果之后要插入400的时候,就会直接复用这个位置,但是磁盘的文件并不变小,当然我如果删除了在跟个pageA的数据,当然也是被复用的,但是数据页的复用和记录的复用是不一样的...我们可以使用下面命令重建mysql5.5版本之前,这个命令的执行流程跟我们前面描述的差不多,区别就是这个临时B不需要手动创建,MySql会自动完成转存数据,就换表明,删除旧表的操作 ?...,添加全文索引和空间索引就属于这种情况, 这个说明一个重建的区别 mysql5.6版本开始alter table t engin=innodb(recreate),默认就是第二张状态图描述的 analyze

5K10

Mysql 索引(学习笔记十二)

因为更新MySQL不仅要保存数据,还要保存一下索引文件。 建立索引会占用磁盘空间的索引文件。 普通索引 创建索引 这是最基本的索引,它没有任何限制。...以下实例为添加索引mysql> ALTER TABLE testalter_tbl ADD INDEX (c); 你还可以 ALTER 命令中使用 DROP 子句来删除索引。...,但在删除索引,你必须知道索引名。...因为更新MySQL不仅要保存数据,还要保存一下索引文件每次更新添加索引列的字段。   都会调整因为更新所带来的键值变化后的索引信息。 ...同一候却会减少更新的速度,如对表进行INSERT、UPDATE和DELETE。由于更新MySQL不仅要保存数据。还要保存一下索引文件。 2、建立索引会占用磁盘空间的索引文件

41330

Innodb加索引,这个时候会锁吗?

MySQL 5.6 起,InnoDB 开始采用一种名为“Online DDL”的技术,允许阻塞其他会话的情况下创建或删除索引。...例如,添加索引,如果中存在大量未提交的事务,则需要等待这些事务提交后才能开始索引构建。因此,建议非高峰时段进行此类操作,以避免影响用户的正常使用。...DDL 操作包括创建、修改和删除数据库中的索引、视图、约束等数据库对象,而涉及实际数据的操作。... MySQL 5.6 之前,所有的 ALTER 操作实际上都会阻塞 DML 操作,例如添加删除字段、添加删除索引等,都会导致被锁定。...对临时进行重命名操作,并创建索引,完成 DDL 操作。 INPLACE 算法原理 INPLACE 算法是 MySQL 5.5 中引入的,旨在优化索引的创建和删除过程的效率。

14210

MySQL数据类型的优化选择

double类型) 浮点类型存储同样范围的值,通常比decimal使用更少的空间。...Char:定长字符串(MySQL删除所有末尾空格) 优点:不易产生碎片 适用:存储密码的MD5值;经常变更的数据; 大型数据类型: Blob:二进制 Text:字符 特殊性:mysql将blob和text...值当做一个独立的对象处理,当值太大,innodb值内存储一个指针,外部存储区域存储实际的值;mysql对blob和text的排序,只对每列的最前max_sort_length进行排序;mysql不能将列的全部长度字符串进行索引...,也不能使用这些索引进行排序; 枚举类型ENUM: mysql存储枚举类型非常紧凑; Mysql在内部会将每个值列表中的位置保存为整数,并且的.frm文件中保存“数字-字符串”的映射关系的查找...; 缺点:字符串列表是固定的,添加删除字符串都需要alter table; 优点:可以缩小的大小;主键减小后,innodb的非主键索引也会变小; 关联速度:enum列 关联 enum列  >  varchar

70320

MySQL ·查看数据库详情

mysql 中,使用 delete 命令删除数据后,会发现这张的数据文件索引文件却奇怪的没有变小。...这是因为 delete 操作并不会真的把数据删除mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你使用 delete 删除中的数据,文件磁盘上所占空间不会变小,我们这里暂且称之为假删除...假删除会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变。这些空洞以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在。...对于 InnoDB ,optimize table 被映射到 alter table 上,这会重建。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。...注意: optimize table 运行过程中,MySQL 会锁定,所以要在空闲时段执行。

14.4K30

MySQL常见存储引擎详解

MySQL5.7版本中,除非在配置文件中显视指定default storage engine或者创建显视使用engine=语句指定其它的存储引擎,否则默认都是InnoDB InnoDB存储引擎的优势在于..., .MYI文件存储索引信息 Memory 存储引擎 Memory存储引擎将所有数据存储在内存中以便加快对某些不重要数据的访问速度 此存储引擎的使用范围已经变小,因为InnoDB已经提供了数据缓存区以便对将经常访问的数据缓存在内存中...当MySQL重启, Memory中的数据会丢失,但结构还在 Memory只适用在只读或者读操作占绝大多数的情况,因为对表的写操作也会导致锁大大限制了并发性 Memory创建之后,磁盘文件会生成一个相同名的文件...列,且其列上可以包含一个索引但在其他字段上不能创建索引 Archive不支持对auto_incrment列插入一个小于当前最大值的数据 Archive存储引擎会用zlib来压缩数据 Blackhole...存储引擎 Merge存储引擎可以将一批字段相同,索引相同且顺序相同的MyISAM逻辑上看做是同一个 Merge磁盘上创建两个文件, .frm文件保存的结构信息, .MRG文件包含所有被视作同一个

42300
领券