[MySQL CPU]线上飙升800%,load达到12的解决过程

标签: mysql cpu 线上 | 发表时间:2014-05-01 17:17 | 作者:mchdba
分享到:
出处:http://blog.csdn.net

接到报警通知,负载过高,达到800%,load也过高,有11了。

MySQL版本为5.6.12-log


1 top 之后,确实是mysqld进程占据了所有资源。


2 查看error日志,无任何异常


3 show eninge innodb status\G,没有死锁信息。


4 show full processlist;

没有耗时非常大的慢sql再跑。看并发,当前的线程总数量也才30个左右。


5 查看iostat,读写正常。


到底是什么问题呢?查看slow log,发现如下SQL,频繁执行,耗时在5秒之间,explain有Using join buffer (Block Nested Loop)

mysql> explain select web_page_object.web_page_object_id,
    ->     web_page_object.object_id,
    ->     web_div_name,web_page_object.position_sort,web_page_object.end_time,om1.label,om1.file,jump_url,om2.label as label1,om2.file as file1
    ->     from web_page_div,web_page_object,object_media as om1,object_media as om2
    ->     where web_page_div.id=web_page_object.web_page_div_id
    ->     and web_page_object.object_media_id=om1.object_media_id
    ->     and web_page_div.web_page_id=1200
    ->     and if(web_page_object.object_media_id1=0,
    ->             web_page_object.object_media_id=om2.object_media_id,
    ->             web_page_object.object_media_id1=om2.object_media_id)
    ->    
    ->     and '2014-05-01 15:09:49'>=start_time
    ->     and '2014-05-01 15:09:49'<= end_time
    ->   
    ->     and object_status=0
    ->     order by web_page_div.id,web_page_object.position_sort;
+----+-------------+-----------------+--------+-----------------------+---------+---------+-------------------------------------------+-------+----------------------------------------------------+
| id | select_type | table           | type   | possible_keys         | key     | key_len | ref                                       | rows  | Extra                                              |
+----+-------------+-----------------+--------+-----------------------+---------+---------+-------------------------------------------+-------+----------------------------------------------------+
|  1 | SIMPLE      | web_page_object | ALL    | object_media_id_index | NULL    | NULL    | NULL                                      | 51165 | Using where; Using temporary; Using filesort       |
|  1 | SIMPLE      | web_page_div    | eq_ref | PRIMARY,idx           | PRIMARY | 4       | db_jiapin.web_page_object.web_page_div_id |     1 | Using where                                        |
|  1 | SIMPLE      | om1             | eq_ref | PRIMARY               | PRIMARY | 4       | db_jiapin.web_page_object.object_media_id |     1 | Using where                                        |
|  1 | SIMPLE      | om2             | ALL    | NULL                  | NULL    | NULL    | NULL                                      | 74759 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-----------------+--------+-----------------------+---------+---------+-------------------------------------------+-------+----------------------------------------------------+
Using join buffer (Block Nested Loop)


看SQL是where后面的if判断引起的,拆分if之后,就正常了,SQL耗时不到0.1秒。数据库load也降下来了。


还记录以前碰到的

(Block Nested Loop)的案例是 join后面的on条件里面有or判断。
也会引起Block Nested Loop,导致数据库负载过高。



作者:mchdba 发表于2014-5-1 17:17:52 原文链接
阅读:129 评论:0 查看评论

相关 [mysql cpu 线上] 推荐:

[MySQL CPU]线上飙升800%,load达到12的解决过程

- - CSDN博客数据库推荐文章
接到报警通知,负载过高,达到800%,load也过高,有11了. MySQL版本为5.6.12-log. 1 top 之后,确实是mysqld进程占据了所有资源. 2 查看error日志,无任何异常. 3 show eninge innodb status\G,没有死锁信息. 没有耗时非常大的慢sql再跑.

sysbench测试MySQL服务器性能(cpu,io,内存,mysql等)

- - CSDN博客数据库推荐文章
Sysbench的安装请参考http://blog.csdn.net/mchdba/article/details/8951289. sysbench采用寻找最大素数的方式来测试CPU的性能. 首先生成需要的测试文件,文件总大小1000M,16个并发线程,随机读写模式. 执行完后会在当前目录下生成一堆小文件.

用MySQL Slow Log解决MySQL CPU占用高的问题

- - OurMySQL
   在Linux VPS系统上有时候会发现MySQL占用CPU高,导致系统的负载比较高. 这种情况很可能是某个SQL语句执行的时间太长导致的. 优化一下这个SQL语句或者优化一下这个SQL引用的某个表的索引一般能解决问题.    但是怎么找到是哪个SQL语句的执行时间过长呢. 可以通过MySQL Slow Log来找,详解如下.

Mysql数据库服务器的CPU占用很高分析

- - ITeye博客
   MySQl服务器CPU占用很高.   一个简单的接口,根据传入的号段查询号码归属地,运行. 性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引.   查询语句索引没有命中导致.   开始时的select. 咨询说where中使用SUBSTRING函数不行,修改函数为LEFT,语句为 SELECT `province_name`, `city_name` FROM `conf_phoneno_section` WHERE LEFT(?, phoneno_section_len) = phoneno_section LIMIT ?.

mysql服务器CPU使用过高的优化方案

- - 数据库 - ITeye博客
当然除了一些加索引的还有少量的通过改代码进行sql语句优化的(例如参数赋值时的数据类型必须要和数据库定义的字段类型相一致,如果是关联查询中,关联字段的数据类型和编码、长度也都要一致,否则很有可能用不上索引),主要是正确的添加索引. 另外也学习了一点:mysql函数 now()、current_date()都是实时变化的,mysql 不会将查询的结果放到查询缓存里,从而降低了查询缓存的命中率.

线上jvm进程CPU load高排查脚本-jkiller

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. 如果遇到线上java进程占用过多的cpu,可以用这个脚本来帮助你快速找到代码的问题. 先用top或者是jps定位占用cpu过多的java进程的pid是多少. 然后执行如下过程即可得到结论:. *centos系统下测试通过. 想快点找到作者也可以到Twitter上留言: @54chen.

[MySQL优化案例]系列 — 典型性索引引发CPU负载飙升问题

- - MySQL中文网 - 叶金荣的技术和生活
收到一个mysql服务器负载告警,上去一看,load average都飙到280多了,用top一看,CPU跑到了336%,不过IO和内存的负载并不高,根据经验,应该又是一起索引引起的惨案了. 看下processlist以及slow query情况,发现有一个SQL经常出现,执行计划中的扫描记录数看着还可以,单次执行耗时为 0.07s,还不算太大.

CPU架构:i386,x86,AMD64

- - 脚本爱好者
IA32 : 32 bits Intel Architecture (32位带宽Intel构架). IA64 : 64 bits Intel Architecture (64位带宽Intel构架). i386 : Intel 386 ( 老的386机器,也泛指IA32体系的CPU). i586 : Intel 586 ( Pentium ,K6 级别CPU ).

8086 CPU 寄存器简介

- 田野 - 博客园-首页原创精华区
打算写几篇稍近底层或者说是基础的博文,浅要介绍或者说是回顾一些基础知识,. 自然,还是得从最基础的开始,那就从汇编语言开刀吧,. 从汇编语言开刀的话,我们必须还先要了解一些其他东西,. 像  CPU ,内存这些知识点还是理解深刻一点的比较好,. 所以这一篇博文就绕着 80x86  CPU 中寄存器的基础部分下手,至于其他的一些将会在后续的博文中介绍.

[MySQL FAQ]系列 — 线上环境到底要不要开启query cache

- - MySQL中文网
Query Cache(查询缓存,以下简称QC)存储SELECT语句及其产生的数据结果,特别适用于:频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息. InnoDB Buffer Pool或者. MyISAM key buffer里读取结果.