首页 > 数据库 >MySQL InnoDB什么时候更新索引的统计信息?

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

时间:2023-09-28 12:14:18浏览次数:45  
标签:信息 索引 InnoDB 更新 MySQL TABLE 统计

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,

标签:信息,索引,InnoDB,更新,MySQL,TABLE,统计
From: https://www.cnblogs.com/kerrycode/p/17735459.html

相关文章

  • Caused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock
    153392398 RUNNING 2023-08-2309:10:09 6 397413 0 2 4 1136 2 2 0 REPEATABLEREAD 1 1 0 0 0 0 328854561014064 RUNNING 2023-08-2309:19:03 0 397493 0 0 0 1136 0 0 0 REPEATABLEREAD 1 1 0 0 0 0 328854560997800 RUNNING 2023-08-2309:06:41 0 39733......
  • 软件测试 - - - 测试数据库mysql
    连接数据库,navicat连接数据库   多使用软件。而不只是记载记笔记。去使用软件。去使用navicat。软件测试 --- 测试数据库dbeaverUltimate有免费的社区版本workbench这是官方做的软件。navicat需要收费,如果破解,大公司会受到律师函。 输入URL,连接数据库,host主机......
  • MYSQL - IF 语句
    背景:求三个字段的和但是其中一个字段有可能是null,相加后结果就是nullselectsum(a+b+c)fromtab;预期:如果sum(a+b+c)为null就不参与运算ifnull:https://blog.csdn.net/weixin_45659364/article/details/115468039......
  • MySQL的锁实现
    数据库锁机制 一.数据库锁的类型和细度   (一)类型     1. 共享锁:读锁,不同事务可以同是读取加共享锁的数据,但是不能同时加写锁和写操作  forshare     2.排他锁:写锁,不同事务,不可以同时读取加锁的资源进行写入  forupdate   (二)细度......
  • Spring Boot与MySQL搭配,打造极简高效的数据管理系统
    ......
  • MySQL运维2-主从复制
    一、主从复制概念主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从服务器中,然后在从服务器上对这些日志重新执行也叫重做,从而使得从数据库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行赋值,从库同时也可以作为其他从服务器的主库,实现链式复制。......
  • mysql查询优化
     最近出现一个问题,mysql历史月表的数据达到2000万左右的时候大概是16G,我们的历史月表有20多个字段。查询速度,非常的慢。  为此,我们花费了一周的时间解决这个查询性能的问题。  首先,我们把当前表的建表语句show了一下,发现字段默认的排序规则是:COLLATE=utf8mb4_0900_ai_ci,......
  • 导入mysql文件报错
    mysql报错:「ERR」1273-Unknowncollation:'utf8mb4_0900_ai_ci'专注数据库知识分享2022-09-2719:05甘肃#MySQL专栏#mysql导入sql文件报错:[ERR]1273-Unknowncollation:'utf8mb4_0900_ai_ci'大致原因:sql对应的mysql版本高于当前要导入的mysql库的版本,引发......
  • mysql入门和高级教程概念
    入门教程MySQL是一个流行的开源关系型数据库管理系统,被广泛用于各种应用程序和网站开发中。以下是一个简单的MySQL教程,介绍了如何入门使用MySQL数据库:1.安装MySQL首先,您需要在计算机上安装MySQL数据库。您可以从MySQL官方网站下载适用于您的操作系统的MySQL安装程......
  • MySQL limit用法
    1、Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。 SELECT*FROMtableLIMIT[offset,]rows|rowsOFFSEToffset  LIMIT子句可以被用于强制SELECT语句返回指定......