3.2.2 慢查询日志(1)
前一小节提到可以通过错误日志得到一些关于数据库优化的信息帮助,而慢查询能为SQL语句的优化带来很好的帮助。可以设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。该阈值可以通过参数long_query_time来设置,默认值为10,代表10秒。
默认情况下,MySQL数据库并不启动慢查询日志,你需要手工将这个参数设为ON,然后启动,可以看到如下结果:
- mysql> show variables like '%long%';
- +-----------------+------------+
- | Variable_name | Value |
- +-----------------+------------+
- | long_query_time | 10 |
- +-----------------+------------+
- 1 row in set (0.00 sec)
- mysql> show variables like 'log_slow_queries';
- +------------------+------------+
- | Variable_name | Value |
- +------------------+------------+
- | log_slow_queries | ON|
- +------------------+------------+
- 1 row in set (0.01 sec)
这里需要注意两点。首先,设置long_query_time这个阈值后,MySQL数据库会记录运行时间超过该值的所有SQL语句,但对于运行时间正好等于long_query_time的情况,并不会被记录下。也就是说,在源代码里是判断大于long_query_time,而非大于等于。其次,从MySQL 5.1开始,long_query_time开始以微秒记录SQL语句运行时间,之前仅用秒为单位记录。这样可以更精确地记录SQL的运行时间,供DBA分析。对DBA来说,一条SQL语句运行0.5秒和0.05秒是非常不同的,前者可能已经进行了表扫,后面可能是走了索引。下面的代码中,是在MySQL 5.1中将long_query_time设置为了0.05:
- mysql> show variables like 'long_query_time';
- +-----------------+--------------+
- | Variable_name | Value|
- +-----------------+--------------+
- | long_query_time | 0.050000 |
- +-----------------+--------------+
- 1 row in set (0.00 sec)
另一个和慢查询日志有关的参数是log_queries_not_using_indexes,如果运行的SQL语句没有使用索引,则MySQL数据库同样会将这条SQL语句记录到慢查询日志文件。首先,确认打开了log_queries_not_using_indexes:
- mysql> show variables like 'log_queries_not_using_indexes';
- +-------------------------------+------------------+
- | Variable_name | Value|
- +-------------------------------+------------------+
- | log_queries_not_using_indexes | ON |
- +-------------------------------+------------------+
- 1 row in set (0.00 sec)
- update 'low_game_schema'.'item' set SLOT='8' where GUID='2222249168632297608' and is_destroy='0';
这里详细记录了SQL语句的信息,如上述SQL语句运行的账户和IP、运行时间、锁定的时间、返回行等。我们可以通过慢查询日志来找出有问题的SQL语句,对其进行优化。随着MySQL数据库服务器运行时间的增加,可能会有越来越多的SQL查询被记录到了慢查询日志文件中,这时要分析该文件就显得不是很容易了。MySQL这时提供的mysqldumpslow命令,可以很好地解决这个问题:
- [root@nh122-190 data]# mysqldumpslow nh122-190-slow.log
- Reading mysql slow query log from nh122-190-slow.log
- Count: 11 Time=10.00s (110s) Lock=0.00s (0s) Rows=0.0 (0), dbother[dbother]@localhost
- insert into test.DbStatus select now(),(N-com_ select)/(N-uptime),(N-com_insert)/(N-uptime),(N-com_ update)/(N-uptime),(N-com_delete)/(N-uptime),N-(N/N), N-(N/N),N.N/N,N-N/(N*N),GetCPULoadInfo(N) from test. CheckDbStatus order by check_id desc limit N
- Count: 653 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 9YOUgs_SC[9YOUgs_SC]@ [192.168.43.7]
- select custom_name_one from 'low_game_schema'.'role_ details' where role_id='S'
- rse 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
本文详细介绍了MySQL慢查询日志的配置、使用及分析方法,包括设置阈值、记录不使用索引的SQL语句、利用mysqldumpslow命令进行日志分析,帮助数据库管理员优化SQL查询性能。
317

被折叠的 条评论
为什么被折叠?



