简介

MySQL的慢查询日志是MySQL提供的一种日志记录,在数据库变得非常大时,通常需要调试性能问题。通常由于缺少索引,当数据库表只有一万行时,查询非常快,当表有数百万行时,这些查询将变得非常慢。MySQL慢查询日志是MySQL数据库服务器注册超过给定执行时间阈值的所有查询的地方。

默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

阅读MySQL慢查询日志

慢查询日志位于:

/var/log/mysql/mysql-slow.log

出于安全原因,您只能使用sudo以root身份访问此文件。

以应用程序的系统用户身份登录时mysql查询语句最常用10个,您将无法读取此文件。

# Time: 140905 6:33:11
# User@Host: dbuser[dbname] @ hostname [1.2.3.4]
# Query_time: 0.116250 Lock_time: 0.000035 Rows_sent: 0 Rows_examined: 20878
use dbname;
SET timestamp=1409898791;
...SLOW QUERY HERE...

mysql查询语句最常用10个_mysql查询语句菜鸟教程_mysql查询语句大全及用法

第一行,SQL查询执行的时间

第二行,执行SQL查询的连接信息

第三行记录了一些我们比较有用的信息

Query_time SQL执行的时间,越长则越慢

Lock_time 在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间

Rows_sent 查询返回的行数

Rows_examined 查询检查的行数

Slow Query日志,虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的,意义可能没有你想象的那么大。它只告诉了你哪些语句慢,但是为什么慢?具体 原因,还是需要你自己去分析,不断的调试。也许,你只需要换一条更有效的sql语句,也许你只需简单地增加一个索引,但也有可能你需要调整你应用程序的设 计方案。比如,上面那条语句是很明显,它检查了600多万行数据。不幸的是,并不是每条语句都这么明显。也许还有别的原因,比如:

*锁表了,导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间

*数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优

*备份数据库,I/O变慢

*也许同时运行了其它的查询,减少了当前查询

所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow query需要特别注意。如果个别出现,则做一些常规检查即可。我们建议mysql查询语句最常用10个,统计并且形成基准报告,进行比较排除,比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。

Using mysqldumpslow

而不是直接读取慢速查询日志,通常最好使用命令mysqldumpslow来解析和汇总慢速查询日志。

您可以在以root用户身份登录时以这样的方式运行命令

sudo -i mysqldumpslow /var/log/mysql/mysql-slow.log

日志分析工具mysqldumpslow

在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow

查看mysqldumpslow的帮助信息:

[root@DB-Server ~]# 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

-s, 是表示按照何种方式排序,

c: 访问计数

l: 锁定时间

mysql查询语句大全及用法_mysql查询语句最常用10个_mysql查询语句菜鸟教程

r: 返回记录

t: 查询时间

al:平均锁定时间

ar:平均返回记录数

at:平均查询时间

-t, 是top n的意思,即为返回前面多少条的数据;

-g, 后边可以写一个正则匹配模式,大小写不敏感的;

比如

mysql查询语句最常用10个_mysql查询语句菜鸟教程_mysql查询语句大全及用法

得到返回记录集最多的10个SQL。

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到访问次数最多的10个SQL

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照时间排序的前10条里面含有左连接的查询语句。

mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现刷屏的情况。

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more

参看文档

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: Lgxmw666