设为首页 收藏本站
查看: 424|回复: 0

[经验分享] mysql 占CPU100%处理一则

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-16 12:52:40 | 显示全部楼层 |阅读模式
今天下班前一位同事负责的一套mysql数据库的CPU使用率达到100%,登上服务器top查看Cpu(s):  95.9%us,  4.0%sy,  0.0%ni, 0.0%id,  20.0%wa,  0.0%hi,  0.0%si,  0.0%st
  由于一直是在做oracle的维护,对mysql不熟悉,先在网上查了几篇文章,但好像都是一个人写的,不过从这些文章中也有了一个大体的处理思路。(由于不是我本人操作,没有记录详细的日志,这里只介绍下处理过程和使用到的命令,正文中的代码只是后期为说明加的。)
  先使用root用户登上mysql,使用 show processlist命令查看当前哪些线程正在运行。查看下来一共有160多个
1
2
3
4
5
6
7
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  1 | root | localhost | NULL | Query   |    0 | init  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)



先简单说一下各列的含义和用途:
id    一个标识,你要kill一个语句的时候很有用。
user   显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql句。
host   显示这个语句是从哪个ip 哪个端口上发出的。可以用来追踪出问题语句的用户。
db    显示这个进程目前连接的是哪个数据库。
command 显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。
time   此这个状态持续的时间,单位是秒。
state  显示使用当前连接的sql语句的状态,很重要的列。state只是语句执行中的某一个状态,以查询sql为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成。
info  显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。
state列各种状态 参考文档:http://blog.csdn.net/e421083458/article/details/38342051
  从show processlist命令输出的结果看到有一条sql语句重复出现,但是info列显示的不全只有select a.col1,a.col2,a.col3 from table1 a这样的信息。那就先从这个表入手查,select count(*) from table1;查出这张表有60W+的数据。select count(*) 使用了6秒。但是现在不确定这个语句执行的时候有没有where条件。
  继续查资料,查到show processlist命令出的结果出处information_schema库下的processlist表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> use information_schema
Database changed
mysql> desc processlist;
+---------+---------------------+------+-----+---------+-------+
| Field   | Type                | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+-------+
| ID      | bigint(21) unsigned | NO   |     | 0       |       |
| USER    | varchar(16)         | NO   |     |         |       |
| HOST    | varchar(64)         | NO   |     |         |       |
| DB      | varchar(64)         | YES  |     | NULL    |       |
| COMMAND | varchar(16)         | NO   |     |         |       |
| TIME    | int(7)              | NO   |     | 0       |       |
| STATE   | varchar(64)         | YES  |     | NULL    |       |
| INFO    | longtext            | YES  |     | NULL    |       |
+---------+---------------------+------+-----+---------+-------+
8 rows in set (0.04 sec)



可看到表porcesslist表的列跟show processlist输出的列是一致的。
再查询processlist表时发现info信息是完整的,在这里找到上边怀疑的sql的完整版为select a.col1,a.col2,a.col3 from table1 a where a.col4='123' and a.col5='abc';
查看这个语句的执行计划(类似下面这种)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> explain select ename,hiredate,sal from emp where sal=1000 \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: emp
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3072
        Extra: Using where
1 row in set (0.00 sec)

ERROR:
No query specified



可以看出语句没有使用索引而是使用全表扫描。分别对col4='123' 和col5='abc'做了统计,发现col4='123'的记录只有一条,而col5='abc'的记录有5W+条,很明显在col4上创建索引执行效率会高很多。查看表上是否有col4列上的索引(类似下面这种)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> show index from emp \G;
*************************** 1. row ***************************
        Table: emp
   Non_unique: 1
     Key_name: idx_emp_2
Seq_in_index: 1
  Column_name: deptno
    Collation: A
  Cardinality: 6
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

ERROR:
No query specified



发现col4列上没有索引,表的存储引擎为 InnoDB,于是在col4列上创建索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> show table status from test1 like 'emp'\G;
*************************** 1. row ***************************
           Name: emp
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 3072
Avg_row_length: 53
    Data_length: 163840
Max_data_length: 0
   Index_length: 65536
      Data_free: 0
Auto_increment: NULL
    Create_time: 2016-11-15 21:54:49
    Update_time: NULL
     Check_time: NULL
      Collation: gbk_chinese_ci
       Checksum: NULL
Create_options:
        Comment:
1 row in set (0.00 sec)

ERROR:
No query specified
mysql> create index idx_sal on emp(sal);
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0



再次查看执行计划,发现语句使用索引扫描。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> explain select ename,hiredate,sal from emp where sal=1000 \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: emp
         type: ref
possible_keys: idx_sal
          key: idx_sal
      key_len: 6
          ref: const
         rows: 1
        Extra: NULL
1 row in set (0.00 sec)

ERROR:
No query specified



sql语句的执行效率立马提升。CPU的使用率也降下来了。

这也还有一个疑问,oracle在创建索引时为了避免锁表引入了online创建索引。不知道mysql中如何在线创建索引?


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301125-1-1.html 上篇帖子: innobackupex实现MySQL数据库的备份与恢复 下篇帖子: MySQL 数据库中MyISAM 和 InnoDB 的区别 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表