`
丁林.tb
  • 浏览: 797063 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于 innodb_stats_on_metadata 的设置问题

阅读更多

这个问题来自冷之同学测试时候碰到的一个“诡异现象”。

 

1、 测试现象       

测试的库有很多数据,但是重启之后,只对一个表的5w条记录作查询。查询条件客户端控制,确保查询范围。innodb_buffer_pool_size设置为35G

现象1:查询性能会出现大幅度抖动;

现象2:介入追查后发现,Innodb_buffer_pool_pages_free = 0

 

         其中bp剩余量这个是最直观异常的,因为访问的5w行记录撑死也不可能把35G内存吃光的。在QA同学确认没有别人在使用这个库的情况下。

 

2、过程和原因

         其实几乎确定还是有别的查询在访问的。所以打开general_log 发现除了QA同学压的语句外,这个Server上还有一些监控语句。

         其中一个语句如下

select constraint_schema,table_name,constraint_name,constraint_type from information_schema.table_constraints where table_schema not in ('information_schema', 'mysql', 'test');  

         这个语句访问了表 information_schema.table_constraints.

跟踪发现这个语句触发了读盘操作。原因是需要访问引擎的info()接口,而InnoDB此时又“顺手”做了更新索引统计的操作dict_update_statistics

更新索引统计的基本流程是随机读取部分demo行。所以这个操作实际上是访问了这个Server里面的所有表,因此不只是访问5w

而且由于别的表事先没有被访问,就会导致读盘操作,也包括BPLRU更新。

 

3、哪些表会触发

         不只是上面提到的table_constraintsinformation_schema库下的一下几个表,访问时候都会触发这个“顺手”操作。

information_schema.TABLES

information_schema.STATISTICS

information_schema.PARTITIONS

information_schema.KEY_COLUMN_USAGE

information_schema.TABLE_CONSTRAINTS

information_schema.REFERENTIAL_CONSTRAINTS

         其实还有 show table status ,也会触发这个操作,只是只处理单表,所以影响没那么明显。

 

4、修改

头痛医头的方法是把这些监控去掉。但实际上像TABLESTABLE_CONSTRAINTS这些表,都是静态数据,访问时不作索引统计也没关系的。

另外一个方法就是把innodb_stats_on_metadata设置成off,这样上述说到的这些表访问都不会触发索引统计。

         实际上这个动态统计的功能已经不推荐了,官方已经在6.0以后增加参数控制DML期间也不作动态统计了。因此这个参数配置成off更合理些(默认是on.

 

    之前有一篇文章也与此相关

0
9
分享到:
评论
1 楼 zhoujy 2012-07-04  
丁奇,你好!文章中的一些不明白的地方请教你一下.

1:
更新索引统计,这个是什么意思?需要占用bp.它是统计各个表中的索引信息(大小,唯一性)?
2:
information_schema 下面的这么多表会触发更新索引统计,包括show table status; 是不是一条简单的select * from 上面所说的表就触发了.
3:
按照文章所说的,innodb_stats_on_metadata 参数关闭比开启好,表访问都不会触发索引统计,推荐关闭吗?

相关推荐

    MYSQL innodb性能优化学习总结

    - **innodb_stats_on_metadata**:控制是否动态收集表统计信息,通常建议关闭,并通过定时任务进行数据统计刷新。 2. **锁和超时配置**: - **innodb_lock_wait_timeout**:控制等待锁释放的超时时间,默认为50秒...

    MYSQL-innodb性能优化学习总结.pdf

    9. **innodb_stats_on_metadata**:关闭时,统计信息不会动态更新,需要定期手动刷新,以提高性能。 10. **innodb_spin_wait_delay**:控制自旋等待时间,过低可能导致CPU资源过度消耗。适当调整可平衡等待和CPU...

    MYSQL-innodb性能优化学习总结[收集].pdf

    9. **innodb_stats_on_metadata**:控制统计信息是否实时更新。关闭时可以节省性能,但需要定期手动或通过调度任务刷新统计信息。 10. **innodb_spin_wait_delay**:设定等待锁的CPU轮询时间,较低值可能导致过多的...

    tencentyun#qcloud-documents#03 周边检查1

    检查说明:innodb_stats_on_metadata 参数开启时,每当查询 information_schema 元数据库里的表,Innodb 就会更新

    installanywhere2009打包Tomcat,jdk,mysql

    innodb_stats_on_metadata=0 innodb_file_per_table=1 innodb_checksum_algorithm=0 back_log=80 flush_time=0 join_buffer_size=256K max_allowed_packet=4M max_connect_errors=100 open_files_limit=4161 query_...

    概述MySQL统计信息

    这些统计信息在特定条件下会被自动更新,如执行`ANALYZE TABLE`命令,或当`innodb_stats_on_metadata=ON`时运行某些查询。此外,当表被首次打开、数据修改达到表总数据的1/16,或者使用了`--auto-rehash`功能时,非...

    MySQL优化之InnoDB优化

    还有`innodb_locks_unsafe_for_binlog`和`innodb_stats_on_metadata`等参数,分别影响锁的处理和统计信息的计算方式。 InnoDB的索引优化也很重要,合理设计索引可以大大提高查询性能。应尽量减少全表扫描,利用好...

    Linux下的MySQL安装及主从配置手册

    - 如果没有`my.cnf`,则创建并编辑该文件,添加必要的配置项,如`innodb_stats_on_metadata`,`collation-server`等,以优化MySQL的性能。 3. **配置文件**: - 在`my.cnf`中,你需要指定数据存储位置、套接字...

    快速增加MYSQL数据库连接数负载能力的方法分享

    `innodb_stats_on_metadata`参数控制是否在查询information_schema表时更新统计信息。若发现有大量读取磁盘进行统计的情况,可以将其设置为0,以减少不必要的磁盘I/O操作,提高性能。 5. **监控与优化查询**: ...

    mysql_health:MySQL 健康检查脚本

    `innodb_stats_on_metadata`参数与InnoDB统计信息有关,当该参数设置为ON时,统计信息的获取会基于metadata,可能会对性能产生影响。在执行大量统计操作时,建议将其临时设置为OFF,以减少对查询性能的影响。 5. **...

    MySQL 8.0统计信息不准确的原因

    此外,对于数据量较大的表,可以使用系统变量 innodb_stats_on_metadata 来控制统计信息的更新时机,避免每次查询元数据时都触发统计信息的更新,从而提升性能。 总之,MySQL 8.0统计信息的准确性对于保证数据库...

Global site tag (gtag.js) - Google Analytics