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

相关推荐
NotFound4862 分钟前
CSS如何利用Flex实现悬浮的侧边按钮组_利用fixed定位与flex布局组合
jvm·数据库·python
神の愛3 分钟前
@Pattern,@NotBlank
数据库·mysql
qq_189807037 分钟前
Golang怎么实现RBAC权限控制_Golang如何用casbin实现基于角色的访问控制系统【教程】
jvm·数据库·python
vegetablec9 分钟前
CSS如何处理相对定位留下的原本占位空白_认识到相对定位不会脱离文档流,需借助负margin消除视觉空隙
jvm·数据库·python
2401_8326355813 分钟前
HTML怎么创建响应式图片备选方案_HTML srcset与sizes结构【详解】
jvm·数据库·python
浅念-15 分钟前
从LeetCode入门位运算:常见技巧与实战题目全解析
数据结构·数据库·c++·笔记·算法·leetcode·牛客
Chasing__Dreams23 分钟前
Mysql--基础知识点--99--两个线程同时给同一个间隙加锁 造成死锁的原因
数据库·mysql
2301_7641505628 分钟前
Pandas GroupBy:将分组数据聚合为列表并赋值到新列
jvm·数据库·python
NotFound48629 分钟前
c++ 逆向工程ida pro c++如何使用ida pro插件和脚本
jvm·数据库·python
qq_1898070332 分钟前
CSS如何根据浏览器支持引入样式_利用@supports进行条件加载
jvm·数据库·python