本文转载自 http://www.jb51.net/article/70955.htm

我们知道分析MySQL语句查询性能的方法除了使用EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。

一、 起因
研发反应某台数据库僵死,后面的会话要么连接不上,要么要花费大量的时间返回结果,哪怕是一个简单的查询。

二、 处理
首先去监控平台查看服务器以及数据库状态,发现这台数据库有大量的慢查询。继续看服务器监控,CPU 平均使用率较高,IO
读写平均值正常。登录到 MySQL,使用 SHOW PROCESSLIST 查看会话状态,总数居然有
600+,这是很不正常的。查看慢查询日志,发现出问题的 SQL 主要集中在几个,有 SUM、有 COUNT、有等值操作等等。这台 MySQL
服务器的 long_query_time 设置为 3秒,而一个简单的查询却要几十秒,这显然是有问题的。写脚本试着 kill
掉相关的会话,发现于事无补,仍然有大量的连接进来。此时使用 top 查看服务器状态,mysqld 进程占用内存和 CPU 居高不下。

故障期间的慢查询数,如图:

CPU 平均使用率,如图:

接着使用 SHOW FULL PROCESSLIST 查看完整状态,在最上面居然发现几条 SQL。这些 SQL
操作使用子查询实现,TIME 列居然达到了 30000 秒,折算过来差不多 10 小时。EXPLAIN 这些语句,居然出现了 USING
TEMPORY 和 USING FILESORT,可以看出这些语句是很糟糕的。于是跟开发确认,紧急把这些会话 kill
掉。稍等片刻,会话数立马降下来,只有 100+,top 查看 mysqld 进程,内存和 CPU 都呈现下降的趋势。接着分析开发说上午 9
时写了这些 SQL,发现有问题,注释掉了。新的代码虽然没有此类
SQL,但之前建立的连接并不会释放。解决问题和出现问题的时间差刚好可以和添加子查询的时间对应,就可以确认子查询是此次故障的罪魁祸首。

三、 总结
通过这个故障,总结如下几点:

  • MySQL 应该尽量避免使用子查询,即使使用,也要搞清楚大表和小表的关系;
  • 出现这类问题的排查步骤

第一,查看服务器监控和 MySQL 监控,分析服务器以及 MySQL 性能,找出异常;
第二,如果是慢查询导致,查看慢查询日志,找出出现问题的 SQL,试着优化,或者把结果缓存;
第三,分清主次,先解决大块问题,后解决细小问题。 把大块的异常解决,小问题就迎刃而解了。比如本文中的例子,把耗费时间长的会话 kill 掉后,后面的连接就正常了;
第四,总结分析。

  • 高效的沟通会事半功倍;
  • DBA 需要定期给出 Top N SQL(类 Oracle 的说法),提供给开发,并协助优化;
  • 查看监控时,不管是服务器监控还是 MySQL 监控,需要做对比,比如和昨天甚至前天的同一时间对比,这会更加快速地定位问题。

四、 技巧
最后,附上一个快速kill 掉 MySQL 会话的方法:

首先使用如下语句分析出有问题的 SQL:

然后将 SHOW FULL PROCESSLIST 的结果保存到一个文件:

grep "XXX" | awk '{print $1}' > mysql_slow.txt

最后使用如下简单的 Shell 脚本 kill 掉相关会话:

1
2
3
SELECT concat('kill ',id,';')
FROM information_schema.processlist
WHERE info like 'XXX';

当然也可以使用如下 SQL 拼接 kill 语句:

1
2
3
SELECT concat('kill ',id,';')
FROM information_schema.processlist
WHERE info like 'XXX';

本文对MySQL慢查询导致故障的起因,处理方法,所需的技巧进行了全面分析,希望可以让大家更好的了解MySQL慢查询,对大家的。

《MySQL》一次MySQL慢查询导致的故障的更多相关文章

  1. Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题

    Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...

  2. php查询mysql返回大量数据结果集导致内存溢出的解决方法

    web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...

  3. 提高MYSQL百万条数据的查询速度

    提高MYSQL百万条数据的查询速度 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 nul ...

  4. 高性能MySQL笔记 第6章 查询性能优化

    6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...

  5. mysql索引优化比普通查询速度快多少

    mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...

  6. 为什么MySQL不推荐使用子查询和join

    前言: 1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据. 2.子 ...

  7. 【mybatis】【mysql】mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains no ...

  8. MySQL 通用查询日志和慢查询日志分析

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句.2)慢查询 ...

  9. 关于MySQL 通用查询日志和慢查询日志分析

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查 ...

随机推荐

  1. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  2. (转)MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项

    出自:http://www.mworkbox.com/wp/work/314.html 2013-05-04 MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略.笔者也 ...

  3. (转)Live555单线程原理

    1. 概述 在live555-Server库中,使用单线程实现了多用户请求视频数据,这似乎多线程才能实现的功能,并且用户请求视频数据各个流程衔接的都十分完美,其执行效率非常高. live555是如何实 ...

  4. VMWare中Linux虚拟机设置静态IP上网的设置方法

    VMWare中Linux虚拟机设置静态IP上网的设置方法 标签: vmwareLinux虚拟机securecrt静态IP上网 2016-05-18 02:30 702人阅读 评论(0) 收藏 举报   ...

  5. Oracle EM错误,java.lang.Exception: Exception in sending Request :: null 分类: Oracle 2015-07-08 21:24 44人阅读 评论(0) 收藏

    操作系统:Win7 64bit Oracle: 10.2.0.1.0 很久没有使用EM了,打开一看,居然报错了,出现java.lang.Exception: Exception in sending ...

  6. Java华氏转摄氏

    package test; import java.util.Scanner; public class temperature { public static void main(String[] ...

  7. 如何构建高性能MySQL索引

    本文的重点在于如何构建一个高性能的MySQL索引,从中你可以学到如何分析一个索引是不是好索引,以及如何构建一个好的索引. 索引误区 多列索引 一个索引的常见误区是为每一列创建一个索引,如下面创建的索引 ...

  8. 2 go语言的基础

    include 内置关键字 注释方法 代码结构(常量,变量,接口,函数的定义) 导入包以及包别名 可见性规则 小练习 内置关键字(25个均为小写) break case chan const cont ...

  9. 5 云计算系列之glance镜像服务安装

    preface 在上节中我们了解了keystone服务,下面就看看glance管理镜像的服务吧. glance组成 glance有两部分组成: glance-api 接受云系统镜像的创建,删除,读取请 ...

  10. 用Python写简单的爬虫

    准备: 1.扒网页,根据URL来获取网页信息 import urllib.parse import urllib.request response = urllib.request.urlopen(& ...