本文已参与「新人创作礼」活动,一起开启掘金创作之路。
(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语句。
查看出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等:
show profile cpu, block io, memory,swaps,context switches,source for query 1
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****
MySQL5.6版本开始,推出了对SQL的跟踪工具trace,通过使用trace,用户可以查看MySQL优化器对SQL语句的分析结果,以及生成了怎样的执行计划。
trace 工具主要看的是 MySQL 大致的优化和计算成本过程
首先需要说明的是开启 trace 工具会影响 MySQL 性能,所以只能临时分析 SQL 使用,用完之后立即关闭。