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

相关推荐
软件技术NINI31 分钟前
springMvc的简单使用:要求在浏览器发起请求,由springMVC接受请求并响应,将个人简历信息展示到浏览器
数据库·mysql
SailingCoder2 小时前
MongoDB Memory Server与完整的MongoDB的主要区别
数据库·mongodb
水木石画室2 小时前
MongoDB 常用增删改查方法及示例
数据库·mongodb
旷世奇才李先生2 小时前
MongoDB 安装使用教程
数据库·mongodb
qq_339282232 小时前
mongodb 中dbs 时,local代表的是什么
数据库·mongodb
阿里云大数据AI技术2 小时前
AI搜索 MCP最佳实践
数据库·人工智能·搜索引擎
笑衬人心。3 小时前
项目中数据库表设计规范与实践(含案例)
服务器·数据库·设计规范
cpsvps3 小时前
触发器设计美国VPS:优化数据库性能的关键策略
数据库·oracle
s153353 小时前
数据结构之顺序表,链表,栈,队列
数据结构·数据库
九分源码4 小时前
基于PHP+MySQL组合开发开源问答网站平台源码系统 源码开源可二次开发 含完整的搭建指南
mysql·开源·php