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

删除后Mysql表索引长度不变

当在MySQL中删除表索引后,索引长度不会立即改变。这是因为MySQL使用了一种称为“延迟删除”(Delayed Key Write)的机制来处理索引的删除操作。

在MySQL中,当删除表索引时,实际上并不是立即从磁盘上删除索引数据。相反,MySQL会将要删除的索引标记为无效,并在后台的维护任务中进行实际的删除操作。这个过程是异步的,因此索引长度不会立即改变。

这种延迟删除的机制有以下几个优势:

  1. 提高删除操作的性能:通过将删除操作推迟到后台执行,可以避免在删除索引时对磁盘进行频繁的写操作,从而提高删除操作的性能。
  2. 减少磁盘碎片:如果立即删除索引数据,可能会导致磁盘上出现大量的碎片空间。延迟删除可以在后台进行整理和优化,减少磁盘碎片。
  3. 支持事务回滚:如果删除操作在事务中执行,并且事务被回滚,延迟删除可以确保索引数据不会立即删除,从而保证事务的一致性。

尽管索引长度在删除操作后不会立即改变,但在后台维护任务执行后,索引长度将会被更新并恢复到正常状态。

对于MySQL中删除后索引长度不变的问题,可以通过以下步骤来解决:

  1. 等待后台维护任务执行:由于延迟删除的机制,索引长度不会立即改变。可以等待一段时间,让后台维护任务执行完毕,索引长度将会被更新。
  2. 重建索引:如果等待时间过长或者索引长度一直没有改变,可以考虑手动重建索引。通过使用ALTER TABLE语句,可以删除并重新创建表索引,从而使索引长度恢复正常。

总结起来,当在MySQL中删除表索引后,索引长度不会立即改变,这是由于MySQL使用了延迟删除的机制。可以等待后台维护任务执行或者手动重建索引来解决这个问题。

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

相关·内容

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

假如我删除500这个数据,innodb只会把这个记录标记为删除,如果之后要插入400的时候,就会直接复用这个位置,但是磁盘的文件并不变小,当然我如果删除了在跟个pageA的数据,当然也是被复用的,但是数据页的复用和记录的复用是不一样的...我们看到当先插入一个数据的时候,此时要申请一个数据页pageB,来保存数据了,页分裂完成,PageA尾部就留下了空洞,另外更新索引的值,可以理解为删除一个数据,新增一条数据,不难理解这样也是会导致空洞的...A一样B,把数据A的数据复制到B, 由于B是新建的,所以B不存在空洞,显然B的主键索引更紧凑,数据页利用率也高,如果我们建立一个临时B,把数据从A导入B的操作完成,用B替换A,...我们可以使用下面命令重建,在mysql5.5版本之前,这个命令的执行流程跟我们前面描述的差不多,区别就是这个临时B不需要手动创建,MySql会自动完成转存数据,就换表明,删除旧表的操作 ?...,添加全文索引和空间索引就属于这种情况, 这个说明一个重建的区别 mysql5.6版本开始alter table t engin=innodb(recreate),默认就是第二张状态图描述的 analyze

5.1K10

针对mysql delete删除数据占用空间不变小的问题

开发环境 MySQL 前言 物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志数据就有174G,当前,这么大的数据量,不仅对数据库造成了很大的负载压力...但是短期内,还需要数据库中的部分日志记录,故而有了下面的删除记录、优化操作。 日志大小一览 本身有六七百万条数据,从六七百万删到五百多万,发现数据占用空间大小一点也没变,如下图所示。...网上查到需要释放删除了的数据占用的空间、也就是优化或碎片整理,使用到的命令是:OPTIMIZE TABLE tableName。...,都不是真删除,只是MySQL给记录加了个删除标识,自然这样操作数据占有空间也不会变小了 注意:DELETE FROM ueb_logistics_rule_logs; 这条sql语句执行,就清空了数据...解决方法 主要就是执行下面三条sql语句(轮询删除delete,避免一次性删除数据太多造成MySQL负载崩溃,另外数据量大的时候需要等待网站访问流量小的时候执行) DELETE FROM ueb_logistics_rule_logs

1.8K21
  • Mysql覆盖索引_mysql索引长度限制

    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回。...只扫描索引而无需回的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。...,但不是整个查询涉及的字段,mysql5.5和之前的版本也会回获取数据行,尽管并不需要这一行且最终会被过滤掉。...如上图则无法使用覆盖查询,原因: 1.没有任何索引能够覆盖这个索引。因为查询从中选择了所有的列,而没有任何索引覆盖了所有的列。 2.mysql不能在索引中执行LIke操作。...这种情况下mysql只能提取数据行的值而不是索引值来做比较 优化SQL:添加索引(artist,title,prod_id),使用了延迟关联(延迟了对列的访问) 说明:在查询的第一阶段可以使用覆盖索引

    7.9K30

    解决sqlite删除数据或者,文件大小不变的问题

    原因: sqlite采用的是变长纪录存储,当你从Sqlite删除数据,未使用的磁盘空间被添加到一个内在的”空闲列表”中用于存储你下次插入的数据,用于提高效率,磁盘空间并没有丢失,但也不向操作系统返回磁盘空间...,这就导致删除数据乃至清空整个数据库,数据文件大小还是没有任何变化,还是很大 解决方法有以下两种: 1、sqlite3中执行vacuum命令即可。...而且,在执行删除操作的时候,也有那个.db-journal文件产生。要使用 auto-vacuum,需要一些前题条件。 数据库中需要存储一些额外的信息以记录它所跟踪的每个数据库页都找回其指针位置。...所以,auto-vacumm 必须在建之前就开启。在一个创建之后, 就不能再开启或关闭 auto-vacumm。

    2K20

    mysql前缀索引 默认长度_如何确定前缀索引长度

    MySQL5.7里默认 innodb_large_prefix=1 解除了767bytes长度限制,但是单列索引长度最大还是不能超过3072bytes。...=1 但是开启该参数还需要开启的动态存储或压缩: 系统变量innodb_file_format为Barracuda ROW_FORMAT为DYNAMIC或COMPRESSED 复制代码 如何确定前缀索引长度...前缀索引的优缺点 占用空间小且快 无法使用前缀索引做 ORDER BY 和 GROUP BY 无法使用前缀索引做覆盖扫描 有可能增加扫描行数 比如身份证加索引,可以加哈希索引或者倒序存储加前缀索引。...再谈联合索引的创建 当我们不确定在一张上建立的联合索引应该以哪个字段作为第一列时,上面的创建规则同样适用。...也就是用此字段创建索引时,它在这个的数据里区分度更加明显。

    3.6K20

    mysql 查看索引、添加索引删除索引命令添加索引删除索引

    查看索引 mysql> show index from tblname; mysql> show keys from tblname; mysql> show index from center_bank_rate...----------+--------+------+------------+---------+---------------+ 1 row in set (0.00 sec) · Table 的名称...· Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 · Cardinality 索引中唯一值的数目的估计值。...基数根据被存储为整数的统计数据来计数,所以即使对于小型,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。...· Comment 添加索引 ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) 删除索引 mysql> alter

    3.4K10

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

    索引文件大小约 595 M,最后修改时间 02:17 说明: MySQL 8.0 版本以前,结构是存在以.frm为后缀的文件里 独享空间存储方式使用.ibd文件来存放数据和索引,且每个一个.ibd...开始时user有1000W条数据,删除若干,目前剩余约 550W 条 5、在删除约500W条记录,再次查看表文件大小 ?...索引文件大小约 595 M,最后修改时间 10:34 实验结论: 对于千万级的数据存储,删除大量记录文件大小并没有随之变小。好奇怪,是什么原因导致的?...修改数据 如果修改的是非索引值,那么并不会影响B+树的结构 ? 比如,更新id=7的其它字段值,主键id保持不变。整个B+树并没有发生结构调整。...待A的数据全部迁移完成,再用B替换A。 MySQL 5.5 版本之前,提供了一键命令,快捷式完成整个流程,转存数据、交换名、删除旧表。

    2.9K51

    清空删除mysql

    Mysql清空(truncate)与删除中数据(delete)的区别 为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经被插入了几万条垃圾留言,如果一条条删除那可真是累人的活。...遂考虑直接进入mysql直接清空或者删除中数据。 本文记录一下这2种操作模式的区别,目标对象是wp_comments,里面的所有留言均是垃圾留言,均可删除。...然后便有了以下2种方式(进入mysql操作界面): truncate table wp_comments; delete * from wp_comments; 其中truncate操作中的table...这两者都是将wp_comments中数据清空,不过也是有区别的,如下: truncate是整体删除(速度较快), delete是逐条删除(速度较慢)。...而delete删除以后,Identity依旧是接着被删除的最近的那一条记录ID加1后进行记录。 如果只需删除中的部分记录,只能使用DELETE语句配合where条件。

    8.1K20

    MySQL索引长度的限制

    参考: http://dinglin.iteye.com/blog/1681332 单列索引长度的限制     (5.6里面默认不能超过767bytes,5.7不超过3072bytes):     起因是...--- by 阿里-丁奇 在MySQL5.6里默认 innodb_large_prefix=0 限制单列索引长度不能超过767bytes    官网文档:https://dev.mysql.com/doc...=ON、innodb_file_format=barracuda、innodb_file_per_table=ON ,且Innodb的存储格式为 DYNAMIC 或 COMPRESSED,则前缀索引最多可包含...在MySQL5.7里默认 innodb_large_prefix=1 解除了767bytes长度限制,但是单列索引长度最大还是不能超过3072bytes 联合索引长度的限制 (不能超过3072bytes...由于需要预留和辅助空间,扣掉不能超过3500,取个“整数”就是 (1024bytes*3=3072bytes)。

    5.4K30

    mysql查询索引_MySQL查看表索引

    mysql> show index from tblname; mysql> show keys from tblname; · Table 的名称。...· Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · Seq_in_index 索引中的列序列号,从1开始。...· Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 · Cardinality 索引中唯一值的数目的估计值。...基数根据被存储为整数的统计数据来计数,所以即使对于小型,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除

    6.8K40

    分库分索引问题

    摘要 最近遇到一个慢sql,在排查过程中发现和分库分索引设置有关系,总结了下问题。...扩展 分库分索引 为什么题目叫分库分索引问题的,直接原因和分库分并没有什么关系啊?因为在排查问题时,犯了一个错误。...以为路由到具体的brandgood_0020,可以直接根据brandgoodid主键索引来查询了。...但其实mysql的分库分不一样,分键不是索引,只是客户端路由。只负责找到对应的。到以后,就是和单一样查询逻辑。...单索引mysql server要面临着索引选择的问题。 当然并不是绝对的,比如上面我举的那个案例。按照这个思路查看了下其他的分索引

    2.6K30

    技术分享 | MySQL 索引长度限制的案例

    前两天同事提了一个问题,MySQL 5.7 中给某张表字段增加一个单键值索引,提示了如下错误, 一些背景信息: 设置的字符集,utf8mb4 。 的存储引擎,MyISAM 。...我们知道,MySQL 和 Oracle 在索引上最大的一个区别,就是索引存在长度的限制。如果是超长键值,可以支持创建前缀的索引,顾名思义,取这个字段的前多少个字符/字节作为索引的键值。...MySQL 官方手册索引的章节提到了,前缀索引长度限制是和引擎相关的,如果用的是 InnoDB ,前缀上限是 767 字节,当启用 innodb_large_prefix 时,上限可以达到 3072 字节...,中存在时间戳的字段,且今年的数据,是1000多万,如果能改应用 SQL ,或者只是通过手工执行 SQL 的前提下,可以有几种解决方案: 如果从原检索,可以创建一个 c1 和时间戳字段的复合索引,利用索引扫描...如果不需要从原检索,可以使用时间戳作为条件,通过 CTAS ,创建一张今年数据的,通过 c1 单键值索引,即可定位数据。

    3.9K30
    领券