MySQL InnoDB什么时候更新索引的统计信息?

这篇具有很好参考价值的文章主要介绍了MySQL InnoDB什么时候更新索引的统计信息?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL InnoDB的索引统计信息在什么时候更新呢? 或者说什么事件会触发InnoDB索引的统计信息更新呢?下面结合参考资料When Does InnoDB Update the Index Statistics? (Doc ID 1463718.1)[1]简单总结梳理一下(文中大部分知识点来自参考资料)。

1: ANALYZE TABLE命令

ANALYZE TABLE命令会显式强制更新表的索引统计信息。例子:

ANALYZE TABLE <TABLE_NAME>;

2:OPTIMIZE TABLE命令

对InnoDB的表执行OPTIMIZE TABLE命令时, OPTIMIZE TABLE重新组织表的数据和关联索引数据的物理存储,以减少存储空间并提高访问表时的I/O效率。通俗点理解就是碎片整理。它会重建表并执行ANALYZE TABLE命令,因此索引的统计信息也会被更新。

3:元数据查看触发

如果您开启了瞬态统计信息(transient statistics)并且innodb_stats_on_metadata参数为ON(MySQL 5.5及更早版本中的默认值,但在MySQL 5.6及更高版本中不是默认值)的话,那么InnoDB会在以下情况下更新索引的统计信息:

查询元数据信息的SQL语句:

  • SHOW TABLE STATUS
  • SHOW INDEX

或者当你访问INFORMATION_SCHEMA下一些表时也会触发统计信息更新,例如:

  • TABLES
  • STATISTICS。

其实实际环境中,这种条件很少触发索引更新统计信息,因为它的条件一般很难满足,正常情况下,这些参数都不会这样设置。

另外这里补充一下transient statistics的知识:

关于瞬态统计信息(transient statistics), 其实transient statistics也叫non-persistent optimizer statistics,翻译成非持久统计信息,它是当innodb_stats_persistent=OFF 或使用 STATS_PERSISTENT=0时,创建或更改单个表时,优化程序统计信息不会保存到磁盘。相反,统计信息存储在内存中,并在服务器关闭时丢失。统计信息也会通过某些操作和特定条件下定期更新。

4 统计信息自动更新

对于使用瞬态统计信息的表,统计信息是在首次打开表时计算的。这包括FLUSH TABLE和FLUSH TABLES WITH READ LOCK。

此外,当表的有大量数据发生变化时,InnoDB还将触发重新计算索引统计信息。逻辑取决于使用的是持久统计信息还是瞬态统计信息:

  • 持久统计信息:为表启用 STATS_AUTO_RECALC(默认情况下设置为默认启用的 innodb_stats_auto_recalc 值)时,当 1/10 (10%) 行发生更改时,索引统计信息将更新,限制为每次更新之间必须至少经过 10 秒。

  • 瞬态统计信息:自上次更新统计信息以来,表中至少 1/16 (6.25%) 的行已被修改。

另外,关于transient statistics,其实有些版本还是有一些Bug的,例如Bug #98546 Transient indexes statistics are updated in foreground causing performance issue

参考资料

[1]

1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=342584987828510&id=1463718.1&_afrWindowMode=0&_adf.ctrl-state=5hdz2z4vn_4,文章来源地址https://www.toymoban.com/news/detail-710226.html

到了这里,关于MySQL InnoDB什么时候更新索引的统计信息?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL中InnoDB索引数据结构(B+树)详解

    B+ 树: 是由二叉查找树,平衡二叉树和B树演化而来 二叉查找树: 任何节点的左节点的值都小于该节点,右节点都大于该节点。 为了避免二叉查找树的极端情况,即太高瘦,引入了平衡二叉树。 平衡二叉树: 又称 AVL 树,在满足二叉查找树特性的基础上,要求每个节点的左

    2024年02月15日
    浏览(60)
  • 一文带你了解MySQL之InnoDB统计数据是如何收集的

    前言 我们前边唠叨查询成本的时候经常用到一些统计数据,比如通过 show table status 可以看到关于表的统计数据,通过 show index 可以看到关于索引的统计数据,那么这些统计数据是怎么来的呢?它们是以什么方式收集的呢?本章将聚焦于 InnoDB存储引擎 的统计数据收集策略,看

    2024年02月06日
    浏览(43)
  • MySQL监控Innodb信息

    Innodb由于支持事务操作,是mysql中使用最多的存储引擎,所以如何监控Innodb存储引擎以进行性能优化是在使用mysql过程中遇到最多的,那么如何进行监控呢? show engine show status 通过查看日志文件 缓冲池信息 缓冲池是Innodb缓存频繁访问数据的地方,对缓冲池内数据的任何更新也

    2024年02月20日
    浏览(39)
  • Spring Boot Elasticsearch7.6.2实现创建索引、删除索引、判断索引是否存在、获取/添加/删除/更新索引别名、单条/批量插入、单条/批量更新、删除数据、递归统计ES聚合的数据

    注意:我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6 引入依赖 有时候你可能需要查询大批量的数据,建议加上下面配置文件

    2024年02月13日
    浏览(70)
  • MySQL--InnoDB的一次更新事务实现流程与二阶段提交

    InnoDB更新事务流程 涉及内容 一次InnoDB的事务更新操作涉及Buffer Pool,BinLog,RedoLog,UndoLog和物理磁盘。 Buffer Pool: Buffer Pool是InnoDB引入的中间层:内存上的一块连续空间,用来缓存数据页,每个数据页的大小为16KB。它的存在是为了提高SQL的读写性能,避免每次查询和修改都直

    2024年02月02日
    浏览(41)
  • MySQL什么时候要分表,什么时候要分库

    在MySQL中,是否需要对表或数据库进行分区的决策取决于多种因素,如数据大小、性能要求、可扩展性需求和底层硬件基础设施。对于何时分区表或数据库,没有固定的阈值,因为它取决于具体的应用程序和工作负载。 当表的大小增长到影响查询性能、维护任务或存储需求时

    2024年02月08日
    浏览(46)
  • MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?

                     💧 M y S Q L ⽀持哪些存储引擎?默认使⽤哪个? M y I S A M 和 I n n o D B 引擎有什么区别,如何选择? color{#FF1493}{MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?} M y SQ L ⽀ 持哪些存储引擎?默认使 ⽤ 哪个? M y I

    2024年02月09日
    浏览(51)
  • Pycharm这个更新索引是个什么操作,为什么每次启动,都会进行?

    点击上方“ Python爬虫与数据挖掘 ”,进行关注 回复“ 书籍 ”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 九重城阙烟尘生,千乘万骑西南行。 大家好,我是皮皮。 一、前言 前几天在Python最强王者交流群【吴超建】问了一个 Pycharm 操作的问题,这里拿出来给大家分

    2024年02月01日
    浏览(56)
  • MySQL 数据存储和优化------MySQL索引原理和优化 ---- (架构---索引---事务---锁---集群---性能---分库分表---实战---运维)持续更新

    Mysql架构体系全系列文章主目录(进不去说明还没写完) https://blog.csdn.net/grd_java/article/details/123033016 本文只是整个系列笔记的第二章:MySQL索引原理和优化,只解释索引相关概念。 索引可以提高查询效率,影响where查询和order by排序,它可以从多方面进行分类,但是实际创建时

    2024年02月02日
    浏览(50)
  • 在Mysql中,什么是回表,什么是覆盖索引,索引下推?

    通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包