首页
学习
活动
专区
圈层
工具
发布

mysql索引为什么要重建

MySQL索引重建的原因及解决方案

基础概念

MySQL索引是一种数据结构,用于快速查询、更新数据库表中的数据。索引可以显著提高查询性能,但也会占用额外的存储空间,并且在数据变更时需要维护。

为什么需要重建索引

  1. 索引碎片化:随着数据的插入、删除和更新,索引可能会变得碎片化,导致查询性能下降。
  2. 索引统计信息过时:MySQL的查询优化器依赖于索引的统计信息来选择最优的查询计划。如果统计信息过时,可能会导致优化器做出错误的决策。
  3. 空间回收:删除大量数据后,索引占用的空间可能不会立即回收,重建索引可以释放这些空间。
  4. 表结构变更:在进行表结构变更(如添加或删除列)后,可能需要重建索引以确保索引的正确性。

优势

  • 提高查询性能:重建索引可以消除碎片化,使索引更加紧凑,从而提高查询速度。
  • 更新统计信息:重建索引会更新索引的统计信息,帮助查询优化器做出更好的决策。
  • 空间优化:重建索引可以回收不再使用的空间,优化存储利用率。

类型

  • 普通索引重建:适用于大多数情况,通过ALTER TABLE table_name ENGINE=InnoDB;命令来重建索引。
  • 在线索引重建:在不影响DML操作的情况下重建索引,适用于大型表。可以使用ALTER TABLE table_name ENGINE=InnoDB ONLINE;命令。

应用场景

  • 数据库维护周期:定期进行数据库维护,包括重建索引。
  • 性能调优:在发现查询性能下降时,可以通过重建索引来优化性能。
  • 数据迁移或备份恢复:在数据迁移或备份恢复后,重建索引可以确保索引的正确性。

解决方案

以下是一个示例代码,展示如何重建MySQL索引:

代码语言:txt
复制
-- 普通索引重建
ALTER TABLE your_table_name ENGINE=InnoDB;

-- 在线索引重建
ALTER TABLE your_table_name ENGINE=InnoDB ONLINE;

参考链接

通过重建索引,可以有效解决索引碎片化、统计信息过时等问题,从而提升数据库的查询性能和整体稳定性。

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

相关·内容

Mysql:好好的索引,为什么要下推?

非主键索引 除了主键索引外,其它的索引都被称为非主键索引。与主键索引不同的是,非主键索引的叶子节点上存储的是主键的值。 那让我们再回到开始的问题,什么是回表操作?...简单来讲,就是在非主键索引树上拿到对应的主键值,然后回到主键索引上找到对应的行数据。 这样做的前提条件是,所要查找的字段不存在于非主键索引树上。...低版本操作 讲完了回表操作,让我们继续回到这篇文章的主题——索引下推。 其实在 Mysql 5.6 版本之前是没有索引下推这个功能的,从 5.6 版本后才加上了这个优化项。...根据联合索引最左前缀原则,我们在非主键索引树上找到第一个满足条件的值时,通过叶子节点记录的主键值再回到主键索引树上查找到对应的行数据,再对比是否为当前所要查找的性别。...总结 回表操作 当所要查找的字段不在非主键索引树上时,需要通过叶子节点的主键值去主键索引上获取对应的行数据,这个过程称为回表操作。 索引下推 索引下推主要是减少了不必要的回表操作。

5.6K31

MySQL索引重建?如何操作?

两周没有更新文章了,最近一直在忙”人生大事”,毕竟人这一生,除了工作、上班还有其他几件重要的事情,而且也是每个人都必须要经历的,走完了,也就走完了…… 言归正传,在日常数据库管理中,经常会遇到索引重建的需求...,针对MySQL数据库,不像Oracle数据库中有支持索引重建的语法(ALTER INDEX … REBUILD),在MySQL数据库中,重建索引具体有哪些方案呢?..., OPTIMIZE TABLE也可以对索引进行重建,官方文档的介绍如下: OPTIMIZE TABLE uses online DDL for regular and partitioned InnoDB...-------+ 1 rows in set (0.00 sec) 从上述结果可以看到,表的创建时间变成了2021-11-09 13:53:53; 在网上有种说法说ANALYZE TABLE方法也可以重建索引...,经过测试,发现ANALYZE TABLE是不会对索引进行重建的,发现ibd文件没有变化,表的修改时间/状态更改时间也没有变化。

5.4K00
  • Postgres为什么要保持索引精简

    Postgres为什么要保持索引精简 您的 API 速度变慢。您检查数据库并在users表上找到 42 个索引。哪些可以安全掉落?它们会花费您多少性能?...索引维护包括多项活动:删除未使用的索引、删除冗余索引以及定期重建索引以摆脱索引膨胀(当然,还要保持自动清理的良好调整)。 我们需要保持索引集精简的原因有很多,其中一些原因很棘手。...为什么要删除未使用的冗余索引 多年来,我一直在收集这些想法。这是当前列表(更多即将推出): 1. 额外的索引会减慢写入速度--臭名昭著的"索引写入放大" 2....定期监控和重建臃肿的索引仍然是重要的维护工作。...删除未使用的索引。删除冗余索引。重新索引降级(臃肿)的索引。并且不要忘记所有这些作的 CONCURRENTLY。 手动完成所有这些是可能的,但当您每周发布功能时,它不会扩展。 保持索引集精简。

    38510

    为什么要关注索引统计误差

    我们知道,InnoDB表里每个辅助索引都会同时存储聚集索引列值,这就是所谓的 Index Extensions特性。...那么,在统计索引信息时,包含聚集索引列的统计值就应该和聚集索引列的值几乎一样的才对,比如:(建议横屏观看) [root@yejr.me]>select * from mysql.innodb_index_stats...解决方案 找出索引统计信息中,辅助索引统计信息和主键索引相差太大的情况,也就是辅助索引的基数和主键索引相差太大的现象,发出告警,并且手动执行 ANALYZE TABLE t 更新索引统计信息,一般就能解决问题了...唯一索引比较特殊,因为在 mysql.innodb_index_stats 表中,唯一索引列统计信息不会再包含主键列,但其基准值和主键列的基准值也不能相差太大。...假设有个表t3的索引统计数据如下(建议横屏观看) [root@yejr.me] [mysql]>select database_name as db, table_name as tbl, index_name

    69210

    Elasticsearch 重建索引

    这时,配置分词库只是第一步操作,因为大量的历史数据在索引时并没有使用新添加的分词库,将导致查询出现不可预期的效果。 此时,我们需要做的就是重建索引。 2....重建索引的使用场景 至少在以下场景需要重建索引。 2.1. 生成索引方式变更 如上所述,因为新的词库的添加,导致历史数据需要按照新的索引生成方式来生成索引。 此时,重建索引就是唯一的选择了。...切分数据 对于已有 ES 集群,数据量庞大到一定程度或因为其他业务上的原因,往往需要将已有数据按照一定的规则进行切分到多个不同的索引中。 这样的过程通过重建索引来实现是非常容易得。...此时也是不得不进行索引的删除重建工作的。 3. 重建索引的过程 对于线上业务来说,我们不能简单暴力地删除已有索引 -> 创建新索引 -> 导入数据的方式来重建索引,这样将严重影响到业务的使用。...正确的流程是: 创建新索引 批量从原索引中将数据导出到新索引中 数据导入完成后,通过 ES 别名机制进行索引切换 删除旧索引 这样就实现了索引的平滑重建。 4.

    1.7K30

    RabbitMQ--索引重建

    在这种情况下,日志文件中可以看到如下类似的日志信息: 从日志的字面意思来看是需要进行索引的重建工作,那么,什么时候需要进行索引的重建,什么时候不需要进行索引的重建?索引重建具体是怎样进行的呢?...【索引重建相关的文件】 在rabbitmq中,持久化消息存储在后缀为rdq的文件中(msg_store的存储方式),消息在队列中的位置(索引)存储在后缀为idx的文件中(消息也可能直接存储在索引文件中,...;否则,则需需要遍历读取所有的消息文件(*.rdq)、队列的索引文件(*.idx)来完成索引的重建工作。...这种情况下,recovery文件会加载失败,因此就需要遍历所有的消息文件与队列索引文件进行索引的重建。 在分析相关源码后,发现,这种情况下的索引重建,队列索引文件(*.idx)会被读取两次。...【总结】 尽可能优雅(正常)的关闭rabbitmq,这样启动时就不会有索引重建的耗时工作了。

    1.1K20

    MySQL为什么会选错索引

    优化器的逻辑 MySQL server层的优化器负责选择索引。而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。...扫描行数是怎么判断的 MySQL 在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,而只能根据统计信息来估算记录数。这个统计信息就是索引的“区分度”。...那么,MySQL 是怎样得到索引的基数的呢?这里,我给你简单介绍一下 MySQL 采样统计的方法。为什么要采样统计呢?...索引选择异常和处理 采用 force index 强行选择一个索引。MySQL 会根据词法解析的结果分析出可能可以使用的索引作为候选项,然后在候选列表中依次判断每个索引需要扫描多少行。...如果 force index 指定的索引在候选索引列表中,就直接选择这个索引,不再评估其他索引的执行代价。 可以考虑修改语句,引导 MySQL 使用我们期望的索引。语义的逻辑是相同的。

    1.3K20

    在Oracle中,索引是否必须定期重建?索引重建有哪些影响?

    题目部分 在Oracle中,索引是否必须定期重建?索引重建有哪些影响? ♣ 答案部分 一般而言,极少需要重建B树索引,基本原因是B树索引很大程度上可以自我管理或自我平衡。...聚簇因子可以反映给定的索引键值所对应的表中的数据排序情况。重建索引不会对聚簇因子产生影响,要改变聚簇因子只能通过重组表的数据。...虽然该方法可以在不锁表的情况下在线运行,但是可能要消耗额外的时间。 (2)重建索引的直接结果是Redo活动可能会增加,总体的系统性能可能会受到影响。...因此,通常最好是让索引处于自然平衡和(或)至少要防止定期重建索引。 (3)通常是优先考虑索引合并(INDEX COALESCE),而不是重建索引。索引合并有如下优点: l 不需要占用过多的磁盘空间。...l 无需重建索引结构,而是尽快地合并索引叶块,这样可避免系统开销过大。 如果将索引转移到其它表空间,那么需要重建索引。 综上所述,Oracle强烈建议不要定期重建索引,而应使用合适的诊断工具。

    2.8K10

    索引重建失败的解决

    在Oracle中创建索引,尤其是大的热表索引(存在很多的活动事务),如果在创建过程中出现异常,例如会话中断(OS层面kill-9),可能会导致Oracle数据字典内已经包含了该索引的信息(诸如像在ind...$的标记位信息不能及时复位),但是却实际没有为该索引分配段,进而导致需要重新建立索引的时候,可能会抛出异常,如下所示,在删除索引IDX1时,会提示索引对象826976号正在创建或者被重建,无法删除,(在...调用dbms_repair存储过程的online_index_clean函数,参数就是上面的索引对象号,这个函数从Oracle 10.2开始支持,在10.2以前,需要等待SMON自己完成清理的工作, This...),SMON进程每60秒尝试一次清理,但是在highly active的数据库,存在很多活动的事务,导致SMON无法以NOWAIT获得对象锁,进而需要等待很久的时间,才能完成清理,在此之前,就无法执行索引重建的工作

    1.4K10

    mysql为什么选错索引?怎么解决?

    mysql为什么选错索引? 在进行慢SQL分析的时候,有时候我们会发现explain的扫描行数和慢日志中的行数相差很大,那explain中的rows这个扫描行数是怎么判断的?...也就是说,这个基数越高,索引的区分度越好。 日常中我们可以通过”show index from tablename”看到一个索引的基数。 MySQL怎样得到索引基数?...Mysql是通过采样统计的方法。为什么要采样统计呢?因为把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高了,所以只能选择“采样统计”。...在MySQL中,有两种存储索引的方式,可以通过设置参数innodb_stats_persistent的值来选择: 当设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10....索引选择异常处理办法 采用force index 强行选择一个索引。 修改sql语句、引导MySQL使用我们期望的索引。

    89810

    MySQL明明有索引,为什么不用?

    一个经典的MySQL索引问题 今天分享一个线上的经典MySQL索引问题。 01背景介绍 今天在线上运维过程中,遇到了一个MySQL的经典索引问题。...但是我们的SQL语句中,除了要访问age,还需要访问id列和name列,所以,在age这个索引上,不能获取所有的数据。...为什么第2个SQL的限制条件更多,但是却能用到索引,第一个SQL的限制条件更少,却用不到索引? 真实情况是什么样子的?...扫描行数100的,采用的方法1,先索引查询,再回表; 扫描行数19900的,采用的方法2,直接查聚集索引。 03 为什么会有这种差异呢? MySQL优化器的逻辑是关键。...4、每条记录每次回表操作都相当于访问一个页面 当然,实际中,比这个计算方法要复杂。

    2.5K20

    Elasticsearch 重建索引 数据迁移

    好事发生今天要分享的好事文章是一篇关于Java线程池底层源码的内容,文章标题【Java线程池底层源码与源码解析】,文章链接:https://cloud.tencent.com/developer/article...然而,随着业务数据的不断增长,我们有时会遇到需要修改现有索引或实际上进行索引重建的情形。面对这种情况,我们应该如何应对呢?本文将围绕这一主题展开深入探讨和处理建议。...处理流程概述重建索引的整体处理流程可以概括为以下几个步骤:首先,创建一个新的临时索引;接着,将原始索引中的数据逐步迁移至这个临时索引中;然后,删除原有的索引;随后,重新创建一个与原始索引结构相同的索引;...通过这一系列操作,我们便能够顺利完成索引的重建工作。...,完成整个重建过程。

    1.2K00

    Oracle 重建索引脚本

    N久以前Oracle建议我们定期重建那些高度为4,已删除的索引条目至少占有现有索引条目总数的20%的这些表上的索引。但Oracle现在强烈建议不要定期重建索引。...具体可以参考文章:Oracle 重建索引的必要性。尽管如此重建索引还是有必要的,只是不建议定期。本文给出了重建索引的脚本供大家参考。...1、重建索引shell脚本 robin@SZDB:~/dba_scripts/custom/bin> more rebuild_unbalanced_indices.sh # +-----------...------------------ find ${LOG_DIR} -name "rebuild_unb*" -mtime +$RETENTION -exec rm {} \; exit 2、重建索引调用的...Oracle 监控索引的使用率 NULL 值与索引(一) NULL 值与索引(二) 函数使得索引列失效 Oracle 索引质量分析 Oracle 重建索引的必要性

    1.4K10

    Oracle 重建索引脚本

    N久曾经Oracle建议我们定期重建那些高度为4。已删除的索引条目至少占有现有索引条目总数的20%的这些表上的索引。但Oracle如今强烈建议不要定期重建索引。...详细能够參考文章:Oracle 重建索引的必要性。 虽然如此重建索引还是有必要的。仅仅是不建议定期。本文给出了重建索引的脚本供大家參考。...1、重建索引shell脚本 robin@SZDB:~/dba_scripts/custom/bin> more rebuild_unbalanced_indices.sh # +-----------...------------------- find ${LOG_DIR} -name "rebuild_unb*" -mtime +$RETENTION -exec rm {} \; exit 2、重建索引调用的...Oracle 监控索引的使用率 NULL 值与索引(一) NULL 值与索引(二) 函数使得索引列失效 Oracle 索引质量分析 Oracle 重建索引的必要性 版权声明:本文博主原创文章

    96910

    为什么MySQL索引要用B+tree

    为什么不采用二叉树 假设此时用普通二叉树记录 id 索引列,我们在每插入一行记录的同时还要维护二叉树索引字段。...但 MySQL 的索引依然 不采用 能够精准定位的 Hash 表 。因为它 不适用 于 范围查询 。 3....为什么不采用红黑树 红黑树是一种特化的 AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡; 若一棵二叉查找树是红黑树,则它的任一子树必为红黑树。...这时候开始查找 id = 7 的树节点只找了 3 次,比所谓的普通二叉树还是要更快的。 但 MySQL 的索引依然 不采用 能够精确定位和范围查询都优秀的 红黑树 。...因为当 MySQL 数据量很大的时候,索引的体积也会很大,可能内存放不下,所以需要从磁盘上进行相关读写,如果树的层级太高,则读写磁盘的次数(I/O交互)就会越多,性能就会越差。 4.

    77274
    领券