MySQL统计信息更新

在MySQL使用"采样统计"的方式来维护统计信息。采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。而数据表是会持续更新的,索引统计信息也不会固定不变。所以,当变更的数据行数超过1/M的时候,会自动触发重新做一次索引统计。

在MySQL中,有两种存储索引统计的方式,可以通过设置参数innodb_stats_persistent的值来选择:

1、设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10。

2、设置为off的时候,表示统计信息只存储在内存中。这时,默认的N是8,M是16。

由于是采样统计,所以不管N是20还是8,这个基数都是很容易不准的。
MySQL 统计信息更新

默认情况下innodb_stats_persistent=ON,优化器的统计信息会持久化保存在mysql.innodb_table_stats和mysql.innodb_index_stats表里。STATS_SAMPLE_PAGES specifies the number of index pages to sample when cardinality and other statistics are calculated for an indexed column, by an ANALYZE TABLE operation, for example.

innodb_stats_persistent_sample_pages控制每次更新统计信息时的采样数据,默认是20,多了会导致analyze命令执行变慢,少了可能导致统计数据不够准确。

innodb_stats_auto_recalc参数默认也是开启的,当一个表数据更新超过10%的时候,会触发统计信息的更新计算。

统计信息的更新是在数据库服务端异步进行的,因此并不一定会在每次执行DML后触发,哪怕表数据更新超过10%也不一定是实时就会触发统计信息的更新(有些场景会延迟几秒后再触发)

可以通过执行Analyze 命令主动触发统计信息的更新。

analyze table命令从库也会执行。

如果将innodb_stats_auto_recalc设置为OFF,不开启自动更新统计信息,可以考虑通过定时任务的试,在业务低峰期触发Analyze命令来更新。

以下几种情况,不管innodb_stats_auto_recalc是ON还是OFF,都会更新innodb_index_stats表的索引统计信息:

表增加索引

表增加或者删除字段

innodb_table_stats和innodb_index_stats这2个表的统计数据,其实也可以通过手动方式去修改它(直接update表数据),修改后,需要执行一下FLUSH TABLE命令更新对应的表统计信息让它加载生效.

相关推荐
q***44811 分钟前
PostgreSQL的备份方式
数据库·postgresql
v***59833 分钟前
【SQL Server】超详细SQLServer日期转换、字符串、数学、聚合等常用函数大全(最新版)
数据库·sqlserver
q***23577 分钟前
python的sql解析库-sqlparse
数据库·python·sql
云和数据.ChenGuang16 分钟前
运维面试题之oracle和mysql单表最大容量
运维·mysql·oracle
q***925121 分钟前
sql实战解析-sum()over(partition by xx order by xx)
数据库·sql
gladiator+23 分钟前
Redis之BigKey的常见问题以及大厂相关面试题
java·数据库·redis
合方圆~小文27 分钟前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
tanxiaomi39 分钟前
Redis相关面试题
数据库·redis·缓存
钮钴禄·爱因斯晨1 小时前
【探索实战】KuratorGitOps 多环境配置管理与合规审计
数据库
Z***G4791 小时前
【零基础学Mysql】常用函数讲解,提升数据操作效率的利器
数据库·mysql