MYSQL慢查询日志的查看

 

前言: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 (请备注数据库管理 )

**************************************************************************************************************

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。