9赞
2131
当前位置:  开发笔记 > 编程语言 > 正文

MySQL数据库执行analyze采集信息

MySQL教程栏目执行analyze采集信息。

MySQL教程栏目执行analyze采集信息。

故障简介

之前,有开发找到我,说应用的某个功能查询比以前慢了很多,让开发提供了慢的SQL语句,去对应的MySQL数据库看了一下执行计划,发现执行计划不正确,第一反应就是其中的一个表的统计信息不准确,导致了SQL语句的执行计划不对,从高效的查询SQL变成了慢SQL。定位到问题之后,自然是 analyze 一下,重新采集信息,这个时候,却发现 analyze 表上的所有 select 突然卡住了,不返回任何结果,然后应用就炸了,各种告警短信。

故障复盘

当时执行analyze操作的是一个slave库,受影响基本是select查询,所以在这里模拟的是查询操作。

创建模拟表

mysql> select * from t_test_1;
+----+--------+-------+--------+
| id | name   | name2 | status |
+----+--------+-------+--------+
|  1 | name1  | 1001  |      0 |
|  2 | name1  | 1002  |      1 |
|  3 | name1  | 1003  |      1 |
|  4 | name1  | 1004  |      0 |
|  5 | name1  | 1005  |      1 |
|  6 | name1  | 1006  |      0 |
|  7 | name1  | 1007  |      2 |
|  8 | name1  | 1008  |      0 |
|  9 | name1  | 1009  |      1 |
| 10 | name10 | 1001  |      0 |
+----+--------+-------+--------+
10 rows in set (0.00 sec) 

模拟慢查询,由于这里数据量不够,所以用sleep代替 session1:模拟慢查询

mysql> select sleep(1000) from t_test_1; 

session2:模拟收集表的统计信息

mysql> analyze table t_test_1; 

session3:模拟执行analyze命令之后,在t_test_1表上执行一次select查询

mysql> select * from t_test_1 where id=5; 

session4:查询所有会话信息

mysql> select * from processlist order by time desc;
+----+------+-----------+--------------------+---------+------+-------------------------+----------------------------------------------+
| ID | USER | HOST      | DB                 | COMMAND | TIME | STATE                   | INFO                                         |
+----+------+-----------+--------------------+---------+------+-------------------------+----------------------------------------------+
| 21 | root | localhost | testdb             | Query   |  242 | User sleep              | select sleep(1000) from t_test_1             |
| 23 | root | localhost | testdb             | Query   |  180 | Waiting for table flush | analyze table t_test_1                       |
| 24 | root | localhost | testdb             | Query   |    3 | Waiting for table flush | select * from t_test_1 where id=5            |
| 22 | root | localhost | information_schema | Query   |    0 | executing               | select * from processlist order by time desc |
+----+------+-----------+--------------------+---------+------+-------------------------+----------------------------------------------+
4 rows in set (0.00 sec) 

从session4获取的所有会话信息中,可以看到有2个会话的状态是“Waiting for table flush”。

Waiting for table flush原因

当MySQL数据库做FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, or OPTIMIZE TABLE这些操作时,会导致需要关闭内存中的表,并重新打开表,加载新的表结构到内存中。但是关闭表,需要等待所有的在这个表上的操作执行结束(包括select,insert,update,lock table等),所以当有一个特别慢的select一直在执行时,analyze table命令就一直无法结束。

解决方案

既然知道什么原因导致的Waiting for table flush,就开始定位慢sql语句。在这里可以看到我们执行的是采集t_test_1表,所以需要查询涉及t_test_1表的慢查询,并且执行时间比analyze table t_test_1的执行时间还要长的会话。

mysql> select * from processlist where info like '%t_test_1%' and time >=(select time from processlist where id=23)  order by time desc;
+----+------+-----------+--------+---------+------+-------------------------+----------------------------------+
| ID | USER | HOST      | DB     | COMMAND | TIME | STATE                   | INFO                             |
+----+------+-----------+--------+---------+------+-------------------------+----------------------------------+
| 21 | root | localhost | testdb | Query   | 1187 | User sleep              | select sleep(1000) from t_test_1 |
| 23 | root | localhost | testdb | Query   | 1125 | Waiting for table flush | analyze table t_test_1           |
+----+------+-----------+--------+---------+------+-------------------------+----------------------------------+
2 rows in set (0.37 sec) 

用上面的sql语句,很容易就定位到id=21的会话,导致analyze table t_test_1卡死,所以需要kill掉会话21.

mysql> kill 21;
Query OK, 0 rows affected (0.01 sec)

mysql> show full processlist;
+----+------+-----------+--------------------+---------+------+----------+-----------------------+
| Id | User | Host      | db                 | Command | Time | State    | Info                  |
+----+------+-----------+--------------------+---------+------+----------+-----------------------+
| 22 | root | localhost | information_schema | Query   |    0 | starting | show full processlist |
| 23 | root | localhost | testdb             | Sleep   | 1205 |          | NULL                  |
| 24 | root | localhost | testdb             | Sleep   | 1028 |          | NULL                  |
+----+------+-----------+--------------------+---------+------+----------+-----------------------+
3 rows in set (0.00 sec) 

杀掉会话,故障解除。

建议

生产执行analyze table建议 1.执行之前,先估算一下表的数据量,根据经验预估需要消耗的时间,同时查看是否有采集信息表的慢SQL,长事务在执行。

2.避免在业务高峰期执行analyze table进行统计信息采集。

更多相关免费学习推荐:mysql教程(视频)

以上就是MySQL数据库执行analyze采集信息的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • java连接mysql数据库jar包怎么导入java连接mysql数据库jar包导入:1.将所有的jar包都是放到web工程lib目录下,mysql-connector-java- ... [详细]
  • MySQL—关键字和增删改查来自MySQL的学习笔记,写的不对的地方大家多多指教哦SELECT、DISTINCT、FROM、JOIN、ON、WHERE、GROUPBY、HAVING ... [详细]
  • mysql 全文检索的匹配问题
    开发过程中碰到一个关于mysql全文检索的问题,控制台打印的SQL语句拿到数据库里执行,结果不对。后来发现原来是少了双引号。下面是网上找到的资料,我是看到这个才意识到自己的问题。这 ... [详细]
  • CSS3 ::selection选择器【HTML】
    web前端|html教程CSS3::selection选择器web前端-html教程之前看到有些网站选中内容的颜色和背景色都不是平时看到的蓝色和白色。今天有兴趣查看了一下,原来是一 ... [详细]
  • 近期就看到一篇博文,介绍limit性能的,感觉非常有用。limit 语法SELECT*FROMtableLIMIT[offset,]rows|rowsOFFSEToffsetLI ... [详细]
  • 1.JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?① 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在SqlM ... [详细]
  • 三层架构的思想
    关于三层架构(3-tierapplication)通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高 ... [详细]
  • 在itoo中,基本上每个系统都有一个导入功能,大量的数据填写进入excel模板中,然后使用导入功能导入的数据库中,这样可以大大的提高工作效率。那么导入就涉及到了批量保存数据库的问题 ... [详细]
  • 饭前思考1 – 主键索引和普通索引有什么区别?
    在MySQL种,索引是在存储引擎层实现的,所以并没有统一的索引标准,由于InnoDB存储引擎在MySQL数据库中使用最为广泛,下面以InnoDB为例来分析一下其中的索引模型,在In ... [详细]
  • 这篇文章主要介绍了Python含参构造函数实例详解的相关资料,需要的朋友可以参考下本篇博文主要介绍在Python3中如何构造含参构造函数样例如下:classMyOdlHttp:us ... [详细]
  • dbca建库后sqlplus提示如下$sqlplusassysdbasqlplus:errorwhileloadingsharedlibraries:u01apporaclepro ... [详细]
  • php表单常用属性有什么?
    后端开发|PHP问题php,表单属性后端开发-PHP问题程序开发中,必不可少的会使用到form表单,以前只是在前端开发时简单使用,对它的属性不甚了解,最近在后端学习中,不断接触到它 ... [详细]
  • 简介:在3月2日的阿里云开源PolarDB企业级架构发布会上,阿里云PolarDB内核技术专家北侠带来了主题为《PolarDB总体架构设计和企业级个性》的精彩演讲。 ... [详细]
  • 平时在开发中避免不了使用大量的ifelse语句,但过多层的ifelse对于性能有很大的开销,类似如下代码publicclassMainStart{pub ... [详细]
  • importcx_Oracle#引用模块cx_Oracleconncx_Oracle.connect('oaoa@192.168.0.70:1521ekp')#连接 ... [详细]
author-avatar
上海外国灬语大学-校友粉丝团
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有