在日常运维及性能分析中,我详细很多朋友都遇到过执行计划选错索引,统计信息更新不及时,优化器判断错误等场景。
在 MySQL 架构中,InnoDB 管理数据并维护统计信息,Server 层优化器则基于这些统计信息生成执行计划。当 innodb_stats_notify_change = OFF 时,即使 InnoDB 在后台自动更新了统计信息(比如索引区分度 rec_per_key),也不会主动通知优化器,优化器会继续使用缓存的旧统计信息来生成计划。如果再叠加上 txsql_recalc_table_stats_after_manual_close = OFF,那么即使表被手动关闭后重新打开,也不会触发统计信息重算,进一步加剧了统计信息陈旧的问题,最终导致选错索引
一、检查参数
可以通过赤兔检查、也可以登录实例检查,接下来以赤兔为例

执行SQL检查
show variables like 'innodb_stats_notify_change'; show variables like 'txsql_recalc_table_stats_after_manual_close';
sql
show variables like 'innodb_stats_notify_change';
show variables like 'txsql_recalc_table_stats_after_manual_close';


二、登录DB节点进行修改
示例以这个实例为基础,生产环境请改成对应的端口

修改参数
切记换成对应的实例端口号和set_id
需要修改的参数如下
.../conf/mysqlagent_4006.xml 换成对应的端口
--name=set_1778464209_8 换成对应的set_id
bash
#进入工具目录,请选择相对应的端口
cd /data/tdsql_run/4006/mysqlagent/bin/
#执行命令修改第一个参数,请注意修改实际的set_id
./mysql_param_modify --agent-conf='../conf/mysqlagent_4006.xml' --mode='modify' \ --param='param=innodb_stats_notify_change&value=ON' \ --name='set_1778464209_8'
完成后会出现Success! 和参数value变成ON

修改第二个参数,只需要改变--param值即可
bash
#进入工具目录,请选择相对应的端口
cd /data/tdsql_run/4006/mysqlagent/bin/
#执行命令修改第一个参数,请注意修改实际的set_id
./mysql_param_modify --agent-conf='../conf/mysqlagent_4006.xml' --mode='modify' \ --param='param=txsql_recalc_table_stats_after_manual_close&value=ON' \ --name='set_1778464209_8'
三、登录赤兔检查
执行同样的SQL
sql
show variables like 'innodb_stats_notify_change';
show variables like 'txsql_recalc_table_stats_after_manual_close';

