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命令更新对应的表统计信息让它加载生效.

相关推荐
kejijianwen1 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石4 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆5 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0665 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下5 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss6 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk7 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK7 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D7 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa