慢查询日志分析
设置慢查询
可以通过修改命令设置:
- 设置开启:SET GLOBAL slow_query_log = 1; #默认未开启,开启会影响性能,mysql重启会失效
- 查看是否开启:SHOW VARIABLES LIKE ‘%slow_query_log%’;
- 设置阈值:SET GLOBAL long_query_time=3;
- 查看阈值:SHOW 【GLOBAL】 VARIABLES LIKE ‘long_query_time%’; #重连或新开一个会话才能看到修改值
也可以通过修改配置文件设置,配置文件 my.conf 会一直生效,在[mysqld]下配置:
1 | [mysqld] |
获取慢 SQL 信息
查看慢查询日志记录数:SHOW GLOBAL STATUS LIKE ‘%Slow_queries%’;
模拟语句:SELECT SLEEP(4);
查看慢查询日志:
1 | $ cat /usr/local/var/mysql/OreChoudeMacBook-Pro-slow.log |
使用 mysqldumpslow 分析
使用样例:
- mysqldumpslow -s r -t 10 /usr/local/var/mysql/OreChoudeMacBook-Pro-slow.log #得到返回记录集最多的10个SQL
- mysqldumpslow -s c -t 10 /usr/local/var/mysql/OreChoudeMacBook-Pro-slow.log #得到访问次数最多的10个SQL
- mysqldumpslow -s t -t 10 -g “LEFT JOIN” /usr/local/var/mysql/OreChoudeMacBook-Pro-slow.log #得到按照时间排序的前10条里面含有左连接的查询语句
- mysqldumpslow -s r -t 10 /usr/local/var/mysql/OreChoudeMacBook-Pro-slow.log | more #结合| more使用,防止爆屏情况
Explain 分析
Show Profile 分析
Show Profile 能够获取比 Explain 更为详细的信息,能够分析当前会话中语句执行时的资源消耗,获取 SQL 在整个生命周期的时间。
开启 Profile
1 | 开启:set profiling = on; |
开启后 MySQL 后台会保存最近 15 次的结果。
查看 Profile
使用 SHOW PROFILES 可以查看最近的 15 次结果。
查看具体的 Profile
通过 Query_ID 可以得到具体 SQL 从连接 - 服务 - 引擎 - 存储四层结构完整生命周期的耗时。
使用命令:SHOW PROFILE CPU, BLOCK IO FOR Query_ID
可用参数type:
- ALL #显示所有的开销信息
- BLOCK IO #显示块IO相关开销
- CONTEXT SWITCHES #上下文切换相关开销
- CPU #显示CPU相关开销信息
- IPC #显示发送和接收相关开销信息
- MEMORY #显示内存相关开销信息
- PAGE FAULTS #显示页面错误相关开销信息
- SOURCE #显示和Source_function,Source_file,Source_line相关的开销信息
- SWAPS #显示交换次数相关开销的信息
如果出现以下几个状态则 SQL 需要重点分析:
- converting HEAP to MyISAM #查询结果太大,内存不够用了,在往磁盘上搬
- Creating tmp table #创建了临时表,回先把数据拷贝到临时表,用完后再删除临时表
- Copying to tmp table on disk #把内存中临时表复制到磁盘,危险!!!
- locked