前言:mysql的慢查询日志是数据库调优的一个主要依据,但是跟踪出来的文件是一个文本文件,查看起来费时费力,mysql也提供了一个工具便于从文本文件里面查找的工具mysqldumpslow。
Mysqldumpslow是安装数据库时会自带的一个软件,在目录/usr/local/mysql/bin下面
[root@mysql01 data]# /usr/local/mysql/bin/mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default //表示排序的类型 al: average lock time //按平均锁定时间排序 ar: average rows sent //平均获取行数排序 at: average query time //平均查询时间排序 c: count //执行次数 l: lock time //锁定时间 r: rows sent //获取行数排序 t: query time //查询时间 -r reverse the sort order (largest last instead of first) //从小到大排序 -t NUM just show the top n queries //查询结果的条目,后面跟数字 -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string //包含特定的字符或字符串 -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time |
[root@mysql01 data]# /usr/local/mysql/bin/mysqldumpslow -s c -t 10 /data/JOEONE-IPOSDS-01-slow.log
查看访问次数最多的10个sql语句;
l [root@mysql01 data]# /usr/local/mysql/bin/mysqldumpslow -s r -t 10 /data/JOEONE-IPOSDS-01-slow.log
查看返回记录集最多的10个sql语句
l [root@mysql01 data]# /usr/local/mysql/bin/mysqldumpslow -t 10 -s t -g "left join" /data/JOEONE-IPOSDS-01-slow.log
查看使用left join的语句
Count: 132 Time=4.21s (555s) Lock=0.00s (0s) Rows=0.4 (53), ipos[ipos]@3hosts 执行次数 平均执行时间/总共执行时间 平均等待锁时间/总等待锁时间 平均获取行数/总获取行数 用户 详细的SQL语句 SELECT cus.zjhfrq,cus.zjrq,cus.headphoto,cus.sr1,cus.sr2,cus.vip,cus.xb,cus.Id,cus.gkdm,cus.gkmc,cus.sj,cus.dh,cus.dz,cus.bz,cus.scdh,cus.sy,cus.lylx,cus.cdbh,cus.jdrq,cus.zd_id,kh.khmc as zdmc, dj.khmc as djzdmc,cus.xfje,cus.dj_zd FROM ipos_customer cus LEFT JOIN com_base_kehu kh ON kh.Id=cus.zd_id LEFT JOIN com_base_kehu dj ON dj.Id=cus.dj_zd WHERE N=N and ( ((cus.zd_id='S'OR cus.dj_zd='S') and cus.vip=N) or ((cus.zd_id='S'OR cus.dj_zd='S') and cus.vip=N)) and cus.sj like 'S' and N=N and N=N order by cus.gkdm DESC LIMIT N |
初步感觉这个语句是可以优化的;
总结:今天又看了公司的数据库通过慢查询日志把一条运行10S的语句优化成0.1S的语句,心情倍感高兴;但这只是万里长征的第一步,毕竟当一个数据库运行到领导要DBA来优化的地步,说明已经有很多的SQL语句有性能问题了,所以路还长着了。
*************************************************************************************************************
本文作者:JOHN,某上市公司DBA,业余时间专注于数据库的技术管理,从管理的角度去运用技术
ORACLE技术博客:ORACLE 猎人笔记 数据库技术群:367875324 (请备注数据库管理 )
**************************************************************************************************************