MySQL语句执行分析
2018-11-25 本文已影响16人
张依一
今天客户那边遇到一个问题:多选文件进行操作,数据量一大后台处理就特别慢,浏览器显示504超时。为了验证问题是否出在sql语句,所以用以下方法来分析:
- 查询SQL执行记录
- explain 分析
- MySQL 语句执行时间
下面会分别介绍三个方法的开启方法。
查询SQL执行记录
查询日志功能是否开启
show variables LIKE 'general%';
image
general_log:日志记录功能是否开启,默认为OFF
general_log_file:日志存放路径
开启日志功能
set GLOBAL general_log = 'ON';
然后再次查询是否开启成功
在指定路径查看SQL记录
explain 分析
大部分的性能分析都需要使用到该命令,可以用来查看SQL语句的执行效果,可以帮助选择更好地索引和优化语句。
语法
explain + SQL语句
输出:
image
参数解析
MySQL 语句执行时间
show profile 以及show profiles语句可以显示当前会话过程中执行SQL语句的性能信息。
查看profile是否开启
show variables like '%profil%';
image
profiling:OFF 默认此功能关闭
设置开启状态
set profiling = 1;
再次查看是否开启
已经是开启状态
执行sql语句后进行分析
执行完后,输入
show profiles;
即可查看所有的sql的执行时间
show profile for query 1
查看第1个sql语句的执行的各个操作的耗时详情。
show profile cpu, block io, memory,swaps,context switches,source for query 6;
可以查看出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等
show profile all for query 6 查看第6条语句的所有的执行信息。
测试完毕后,关闭参数:
mysql> set profiling=0
慢查询
开启慢查询,可以设置一个时间阈值,当sSQL执行时间超过阈值,则会被记录。通过这样可以定位到需要优化的SQL
查看慢查询命令
mysql> show variables like 'slow_query%';
+---------------------+--------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/50aacb0262cd-slow.log |
+---------------------+--------------------------------------+
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
参数说明:
slow_query_log :是否开启慢查询
slow_query_log_file :慢查询日志存放位置
long_query_time:设置阈值,超过该值才会做记录
设置步骤
开启慢查询
set global slow_query_log='ON';
设置存放日志位置
set global slow_query_log_file='/var/lib/mysql/slow.log ';
设置超时时间
set global long_query_time=1;
日志效果
- 首先我执行一句SQL
mysql> select sleep(3); +----------+ | sleep(3) | +----------+ | 0 | +----------+ 1 row in set (3.00 sec)
-
查看日志记录
image
可以查看到涉及到超过1S的SQL详情