mysql诊断步骤

47 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


(1) 一 通过慢查日志等定位那些执行效率较低的SQL语句****

//查看慢查询存放日志show variables like 'slow_query_log_file';

 

(2) explain 分析SQL的执行计划********

explain+SQL语句即可!详情

 

(3) show profile 分析****

Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在什么地方。

但是Query Profiler却可以定位出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等,以及该SQL执行所耗费的时间等。  

1) show profiles 执行之后结果有三列,分别是

Query_ID:SQL编号ID;

Duration:SQL执行时间;

Query:SQL语句。   image.png  

查看出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等:

show profile cpu, block io, memory,swaps,context switches,source for query 1   image.png

2) SQL执行过程中可能导致时间慢的原因

Sending data (最重要的一个过程★★★★★)****

  线程正在读取和处理一条SELECT语句的行,并且将数据发送至客户端。由于在此期间会执行大量

  的磁盘访问(读操作),这个状态在一个指定查询的生命周期中经常是耗时最长的。

  

  对于一个普通查询来说,这个参数过大可分为两种情况

  1. 第一种是SQL本身,比如没有建立正确的索引,索引失效等等情况,这种数据体现在CPU_user 和CPU_sysyem字段 时间过长;

  2. 第二种是相应数据量过大,导致CPU调度时上下文频繁切换。这种数据体现在CONTEXT_INVOLUNTARY和CONTEXT_VOLUNTARY字段 时间过长;

  像:外网使用Navicat连接到远程数据库中。查询一个普通的SQL,在本地MySQL执行速度很快,但是使用远程服务器的MySQL就异常的缓慢。

  这时若查询profile详情,就会发现大量相应数据传输IO导致频繁的上下文切换消耗了大量的时间。  

converting HEAP to MyISAM****

   原译指的是:线程将一个内部临时表转换为磁盘上的MyISAM表。

   我们实际操作中可能出现的问题就是查询结果太大了导致内存不够,往磁盘上搬。

 

Creating tmp table****

  创建了临时表

 

Coping to tmp table on disk****

  把内存中临时表复制到磁盘

 

locked****

  加锁

(4) Trace****

 

blog.csdn.net/weixin_4336…

 

MySQL5.6版本开始,推出了对SQL的跟踪工具trace,通过使用trace,用户可以查看MySQL优化器对SQL语句的分析结果,以及生成了怎样的执行计划。

image.png

trace 工具主要看的是 MySQL 大致的优化和计算成本过程

首先需要说明的是开启 trace 工具会影响 MySQL 性能,所以只能临时分析 SQL 使用,用完之后立即关闭。