引言: MySQL是目前最为流行的数据库,在实际应用中,需要关注的查询比较慢的SQL语句,在Mysql中已经提供了类似的设置,帮忙我们将执行时间超过某个时间阀值的SQL打印出来。本文将介绍如何来设置并使用这个功能。
1. 设置选项
-
long_query_time
定义慢查询SQL的时间阀值,执行时间超过这个阀值即被标识为慢SQL。 其值范围为: 0~~10
是否打开慢SQL的开关阀值: 取值为0(OFF), 1 (ON)
- show_query_log_file
指定慢查询所在log文件的位置
2. 使用示例
2.1 查询慢SQL设置
long_query_time的设置,其取值范围为0~10秒
2.2 其他参数设置
这里的设置log_slow_admin_statements: 标识是否记录admin命令的慢查询,值范围同于slow_query_log.
log_slow_slave_statements: 标识是否记录slave节点命令的慢查询,值范围同于slow_query_log.
slow_launch_time: slow_launch_time的设定跟慢查询日志的查询阀值设定不同,表示了thread create的一个阀值,如果thread create的时间超过了这个值,这变量slow_launch_time的值加1.slow_launch_time的设定跟慢查询日志的查询阀值设定不同,表示了thread create的一个阀值,如果thread create的时间超过了这个值,这变量slow_launch_time的值加1.
3. Session和global设置
global的variables设置的是全局变量,变量更新设置之后,只针对新链接生效,对于已有的连接只有断开重新连接之后,方可生效。
每一个连接下会保留一套自己的session varaibles, 全局的变量修改,不影响session下的设置, 全局下的设置在重连之后方可生效。
session级别在设置后立即生效 断开连接后变量就失效了
set session sort_buffer_size=10000
global不是立即生效 而是对新连接生效
set global sort_buffer_size=100000(要求有管理员权限)
4. 慢查询日志示例
根据上次的设置,慢查询日志文件为: /var/lib/mysql/flybird-sql.log
文件内容示例:
/usr/sbin/mysqld, Version: 5.6.28 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 160810 11:07:36
# User@Host: root[root] @ localhost [] Id: 15807
# Query_time: 0.095879 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
use zabbixdb;
SET timestamp=1470798456;
set global slow_query_log=ON;
# Time: 160810 11:07:57
# User@Host: root[root] @ localhost [] Id: 15807
# Query_time: 0.114148 Lock_time: 0.000114 Rows_sent: 1 Rows_examined: 311632
SET timestamp=1470798477;
select count(*) from history_uint;
# Time: 160810 11:10:12
# User@Host: root[root] @ [101.254.182.34] Id: 15808
# Query_time: 0.054581 Lock_time: 0.000137 Rows_sent: 1 Rows_examined: 6559
SET timestamp=1470798612;
select count(*) from history_text;
# Time: 160810 11:10:21
# User@Host: root[root] @ [101.254.182.34] Id: 15808
# Query_time: 0.116142 Lock_time: 0.000144 Rows_sent: 1 Rows_examined: 311632
SET timestamp=1470798621;
select count(*) from history_uint
内容分析: 每个SQL都会记录比较完成的信息,比如来源用户以及主机信息, 整个SQL执行的相对比较完整的信息,以及具体的SQL语句。
# Time: 160810 11:10:21 #执行时间
# User@Host: root[root] @ [101.254.182.34] Id: 15808 # 用户、主机以及进程ID
# Query_time: 0.116142 Lock_time: 0.000144 Rows_sent: 1 Rows_examined: 311632 #sql执行时间分布
SET timestamp=1470798621;
select count(*) from history_uint #具体的SQL
5. 参考资料
- http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
- http://blog.163.com/longsu2010@yeah/blog/static/173612348201162595425697/