MTSQL 慢查询日志 1

本文详细介绍了MySQL慢查询日志的配置、使用及分析方法,包括设置阈值、记录不使用索引的SQL语句、利用mysqldumpslow命令进行日志分析,帮助数据库管理员优化SQL查询性能。

3.2.2   慢查询日志(1)

前一小节提到可以通过错误日志得到一些关于数据库优化的信息帮助,而慢查询能为SQL语句的优化带来很好的帮助。可以设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。该阈值可以通过参数long_query_time来设置,默认值为10,代表10秒。

默认情况下,MySQL数据库并不启动慢查询日志,你需要手工将这个参数设为ON,然后启动,可以看到如下结果:

  1. mysql> show variables like '%long%';
  2. +-----------------+------------+
  3. | Variable_name | Value |
  4. +-----------------+------------+
  5. | long_query_time | 10 |
  6. +-----------------+------------+
  7. 1 row in set (0.00 sec)
  8. mysql> show variables like 'log_slow_queries';
  9. +------------------+------------+
  10. | Variable_name | Value |
  11. +------------------+------------+
  12. | log_slow_queries | ON|
  13. +------------------+------------+
  14. 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:

  1. mysql> show variables like 'long_query_time';
  2. +-----------------+--------------+
  3. | Variable_name | Value|
  4. +-----------------+--------------+
  5. | long_query_time | 0.050000 |
  6. +-----------------+--------------+
  7. 1 row in set (0.00 sec)

另一个和慢查询日志有关的参数是log_queries_not_using_indexes,如果运行的SQL语句没有使用索引,则MySQL数据库同样会将这条SQL语句记录到慢查询日志文件。首先,确认打开了log_queries_not_using_indexes:

  1. mysql> show variables like 'log_queries_not_using_indexes';
  2. +-------------------------------+------------------+
  3. | Variable_name | Value|
  4. +-------------------------------+------------------+
  5. | log_queries_not_using_indexes | ON |
  6. +-------------------------------+------------------+
  7. 1 row in set (0.00 sec)
  8. update 'low_game_schema'.'item' set SLOT='8' where GUID='2222249168632297608' and is_destroy='0';

这里详细记录了SQL语句的信息,如上述SQL语句运行的账户和IP、运行时间、锁定的时间、返回行等。我们可以通过慢查询日志来找出有问题的SQL语句,对其进行优化。随着MySQL数据库服务器运行时间的增加,可能会有越来越多的SQL查询被记录到了慢查询日志文件中,这时要分析该文件就显得不是很容易了。MySQL这时提供的mysqldumpslow命令,可以很好地解决这个问题:

  1. [root@nh122-190 data]# mysqldumpslow nh122-190-slow.log
  2. Reading mysql slow query log from nh122-190-slow.log
  3. Count: 11 Time=10.00s (110s) Lock=0.00s (0s) Rows=0.0 (0), dbother[dbother]@localhost
  4. 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
  5. Count: 653 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 9YOUgs_SC[9YOUgs_SC]@ [192.168.43.7]
  6. select custom_name_one from 'low_game_schema'.'role_ details' where role_id='S'
  7. rse and summarize the MySQL slow query log. Options are
  8. --verbose verbose
  9. --debug debug
  10. --help write this text to standard output
  11. -v verbose
  12. -d debug
  13. -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
  14. al: average lock time
  15. ar: average rows sent
  16. at: average query time
  17. c: count
  18. l: lock time
  19. r: rows sent
  20. t: query time
  21. -r reverse the sort order (largest last instead of first)
  22. -t NUM just show the top n queries
  23. -a don't abstract all numbers to N and strings to 'S'
  24. -n NUM abstract numbers with at least n digits within names
  25. -g PATTERN grep: only consider stmts that include this string
  26. -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
  27. default is '*', i.e. match all
  28. -i NAME name of server instance (if using mysql. server startup script)
  29. -l don't subtract lock time from total time
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值