MYSQL 慢查询日志 2

3.2.2   慢查询日志(2)

如果我们想得到锁定时间最长的10条SQL语句,可以运行:

 
 
  1. [root@nh119-141 data]# /usr/local/mysql/bin /mysqldumpslow -s al -n 10 david.log
  2. Reading mysql slow query log from david.log
  3. Count: 5 Time=0.00s (0s) Lock=0.20s (1s) Rows=4.4 (22), Audition [Audition]@[192.168.30.108]
  4. SELECT OtherSN, State FROM wait_friend_info WHERE UserSN = N
  5. Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=1.0 (1), audition-kr[audition-kr]@[192.168.30.105]
  6. SELECT COUNT(N) FROM famverifycode WHERE UserSN=N AND verifycode='S'
  7. ......

MySQL 5.1开始可以将慢查询的日志记录放入一张表中,这使我们的查询更加直观。慢查询表在mysql架构下,名为slow_log。其表结构定义如下:

 
 
  1. mysql> show create table mysql.slow_log;
  2. *************************** 1. row ***************************
  3. Table: slow_log
  4. Create Table: CREATE TABLE 'slow_log' (
  5. 'start_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  6. 'user_host' mediumtext NOT NULL,
  7. 'query_time' time NOT NULL,
  8. 'lock_time' time NOT NULL,
  9. 'rows_sent' int(11) NOT NULL,
  10. 'rows_examined' int(11) NOT NULL,
  11. 'db' varchar(512) NOT NULL,
  12. 'last_insert_id' int(11) NOT NULL,
  13. 'insert_id' int(11) NOT NULL,
  14. 'server_id' int(11) NOT NULL,
  15. 'sql_text' mediumtext NOT NULL
  16. ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  17. 1 row in set (0.00 sec)

参数log_output指定了慢查询输出的格式,默认为FILE,你可以将它设为TABLE,然后就可以查询mysql架构下的slow_log表了,如:

 
 
  1. mysql> show variables like 'log_output';
  2. +---------------+---------+
  3. | Variable_name | Value |
  4. +---------------+---------+
  5. | log_output | FILE |
  6. +---------------+---------+
  7. 1 row in set (0.00 sec)
  8. mysql> set global log_output='TABLE';
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> show variables like 'log_output';
  11. +---------------+---------+
  12. | Variable_name | Value |
  13. +---------------+---------+
  14. | log_output | TABLE |
  15. +---------------+---------+
  16. 1 row in set (0.00 sec)
  17. mysql> select sleep(10);
  18. +-----------+
  19. | sleep(10)|
  20. +-----------+
  21. | 0 |
  22. +-----------+
  23. 1 row in set (10.01 sec)
  24. mysql> select * from mysql.slow_log\G;
  25. *************************** 1. row ***************************
  26. start_time: 2009-09-25 13:44:29
  27. user_host: david[david] @ localhost []
  28. query_time: 00:00:09
  29. lock_time: 00:00:00
  30. rows_sent: 1
  31. rows_examined: 0
  32. db: mysql
  33. last_insert_id: 0
  34. insert_id: 0
  35. server_id: 0
  36. sql_text: select sleep(10)
  37. 1 row in set (0.00 sec)

参数log_output是动态的,并且是全局的。我们可以在线进行修改。在上表中我设置了睡眠(sleep)10秒,那么这句SQL语句就会被记录到slow_log表了。

查看slow_log表的定义会发现,该表使用的是CSV引擎,对大数据量下的查询效率可能不高。我们可以把slow_log表的引擎转换到MyISAM,用来进一步提高查询的效率。但是,如果已经启动了慢查询,将会提示错误:

 
 
  1. mysql> alter table mysql.slow_log engine=myisam;
  2. ERROR 1580 (HY000): You cannot 'ALTER' a log table if logging is enabled
  3. mysql> set global slow_query_log=off;
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> alter table mysql.slow_log engine=myisam;
  6. Query OK, 1 row affected (0.00 sec)
  7. Records: 1 Duplicates: 0 Warnings: 0

不能忽视的是,将slow_log表的存储引擎更改为MyISAM后,对数据库还是会造成额外的开销。不过好在很多关于慢查询的参数都是动态的,我们可以方便地在线进行设置或者修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值