起因
在 MySQL 服务器运行 mysqld_exporter 后, 发现数据库的中活跃连接数暴增, 而且都是来自于 mysqld_exporter 的慢查询, 语句如下:
- SELECT
- TABLE_SCHEMA,
- TABLE_NAME,
- TABLE_TYPE,
- ifnull(ENGINE, 'NONE') as ENGINE,
- ifnull(VERSION, '0') as VERSION,
- ifnull(ROW_FORMAT, 'NONE') as ROW_FORMAT,
- ifnull(TABLE_ROWS, '0') as TABLE_ROWS,
- ifnull(DATA_LENGTH, '0') as DATA_LENGTH,
- ifnull(INDEX_LENGTH, '0') as INDEX_LENGTH,
- ifnull(DATA_FREE, '0') as DATA_FREE,
- ifnull(CREATE_OPTIONS, 'NONE') as CREATE_OPTIONS
- FROM information_schema.tables
- WHERE TABLE_SCHEMA = 'xxx';
分析
1. 在该数据库执行该语句, 执行时间非常慢
102 rows in set (6.35 sec)
2. 在该数据库的从库执行, 结果却完全不一样
102 rows in set (0.01 sec)
3. 这个时候就可以确定应该跟 MySQL 统计信息有关.
查看 MySQL 统计信息相关介绍:
4. 查看主从数据库的参数, 发现差异
- ## 主库
- MySQL> show variables like 'innodb_stats_on_metadata';
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | innodb_stats_on_metadata | ON |
- +--------------------------+-------+
- 1 row in set (0.00 sec)
- ## 从库
- MySQL> show variables like 'innodb_stats_on_metadata';
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | innodb_stats_on_metadata | OFF |
- +--------------------------+-------+
- 1 row in set (0.00 sec)
5. 确定原因为每次查询时都会对统计信息进行更新.
查看 MySQL 官方文档
非持久化统计信息在以下情况会被自动更新 |
---|
1 执行 ANALYZE TABLE |
2 innodb_stats_on_metadata=ON 情况下,执 SHOW TABLE STATUS, SHOW INDEX, 查询 INFORMATION_SCHEMA 下的 TABLES, STATISTICS |
3 启用 --auto-rehash 功能情况下,使用 mysql client 登录 |
4 表第一次被打开 |
5 距上一次更新统计信息,表 1/16 的数据被修改 |
解决
修改参数 innodb_stats_on_metadata
- MySQL> set global innodb_stats_on_metadata=0;
- Query OK, 0 rows affected (0.00 sec)
来源: http://www.bubuko.com/infodetail-2984885.html