一、排查占用CPU较高的SQL
1. 通过top获取mysql的pid
2. 使用pidstat -t -p <mysql_pid> 1 命令查看占用cpu较高线程TID:
-t:显示选择任务的线程的统计信息外的额外信息
-p:指定进程号
3. 连接数据库,通过select * from performance_schema.threads where THREAD_OS_ID=TID \G 的sql语句查找到相应的sql文本
二、排查慢SQL
2.1 开启慢查询日志
1. 查看是否开启慢日志查询:show variables like 'slow_query_log';
未开启,设置:set global slow_query_log=1;
2. 设置日志记录SQL的超时时间,long_query_time默认为10秒。
查看当前的超时时间:show variables like 'long_query_time';
设置超时时间:set globallong_query_time=1;(单位:秒)
3. 查看慢查询日志存放路径:show global variables like 'show_query_log_file';
2.2 分析慢查询日志
①日志详解
tail -n 50 path日志路径
关注以下几个参数:
Query_time:sql执行时间
Lock_time:在服务器阶段等待表锁的时间
Rows_sent:查询返回的行数
Rows_examined:查询检查的行数,越长耗时越久
②mysqldumpslow使用搭配参数:
s:表示按照何种方式排序
c:访问次数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
t:返回前面多少条数据
g:后面搭配一个正则表达式
备注:日志较大,结合more使用
1)得到按时间排序的前10条SQL,时间是所记录次数的总时间:mysqldumpslow -s -t 10 path(日志路径)
示例:mwsqldumpslow -s -t 10 /mysqllog/mysql3306/log/mysql-slow.log | more
2)得到返回记录集最多的10个SQL:mysqldumpslow -s r -t 10 path
3)得到访问次数最多的10个SQL:mysqldumpslow -s c -t 10 path
4)得到按时间排序的前10条里面含有左连接的查询:mysqldumpslow -s t -t 10 -g "left join" path