需要记录慢查询,在配置文件中加入慢查询的相关配置。
/etc/my.cnf
general_log=off
log_output=table
slow_query_log=1
long_query_time=0.3
- general_log=off 会记录所有的查询,建议关闭(set global general_log = off)
- log_output=table 将log记录到表中
- slow_query_log=1 开启慢查询记录
- long_query_time=0.3 大于0.3秒的查询会被记录
配置好以后,我的做法是使用python每周读取数据库中的记录,邮件发出来以便分析。
sql如下:
SELECT max(user_host), min(start_time), max(start_time), count(*), sum( CASE WHEN TIME_TO_SEC(query_time) = 0 THEN 0.3 ELSE TIME_TO_SEC(query_time) END ), max( CASE WHEN TIME_TO_SEC(query_time) = 0 THEN 0.3 ELSE TIME_TO_SEC(query_time) END ), min( CASE WHEN TIME_TO_SEC(query_time) = 0 THEN 0.3 ELSE TIME_TO_SEC(query_time) END ), round( avg( CASE WHEN TIME_TO_SEC(query_time) = 0 THEN 0.3 ELSE TIME_TO_SEC(query_time) END ), 2 ), sql_text FROM slow_log WHERE sql_text NOT LIKE ‘%SQL_NO_CACHE%‘ GROUP BY LEFT (sql_text, 40) ORDER BY count(*) DESC LIMIT 20;
部分python代码如下:
for i in range(len(conn)): log=p.get_table(conn[i],sql) query_log+=‘_‘*120+‘\r\n‘ query_log+="Slow_Log_%s:%s____%s\r\n\r\n" % (conn[i]["host"],conn[i]["port"],days) for n in range(len(log)): query_log+="%s %s %s %s %s " % (str(log[n][3]),str(log[n][4]),str(log[n][5]),str(log[n][6]),str(log[n][7])) query_log+="user_host :%s start_time :%s end_time :%s\r\n" % (str(log[n][0]),str(log[n][1]),str(log[n][2])) query_log+=‘ ‘*40+squeeze(str(log[n][8]))+‘\r\n\r\n‘ mail.send_mail(mail_list,mail_title,query_log)
得到的邮件部分:
Slow_Log_x.x.x.x:3306____2016-05-26
1889 704.4 33.0 0.3 0.37 user_host :x[x] @ [x] start_time :2016-05-25 09:30:27 end_time :2016-05-26 09:16:05
select max(online_user),round(sum(online_user)/count(id)) from online where datetime >= ‘2016-05-25‘ and server_id = 27
这样就可以看到每周比较慢的查询,然后进行优化分析。
时间: 2024-10-15 15:14:48