常常遇到这样的问题:数据库访问量很大,想要从SQL方面进行优化。往往开发同学会问:能看到哪些SQL执行比较频繁吗?回道:不能哦,只能看到当前正在运行的SQL和慢日志里记录的SQL。
Mysql提供了两种查询日志,它们可以为我们获取以上信息提供帮助。 这两种查询日志为普通日志(general log)和慢速日志(slow log)。
普通日志(general log)
Geleral log记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来(Mysqld将接收到的语句按照接收的顺序(注意不是执行顺序)写到查询日志文件中。) ,记录的格式为 {Time ,Id ,Command,Argument }。也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。为了性能考虑,一般general log不会开启。slow log可以定位一些有性能问题的sql,而general log会记录所有的SQL。mysql5.0版本,如果要开启slow log、general log,需要重启,从MySQL5.1.6版开始,general query log和slow query log开始支持写到文件或者数据库表两种方式,并且日志的开启,输出方式的修改,都可以在Global级别动态修改。
root@(none) 09:40:33>select version();
+————+
| version() |
+————+
| 5.1.37-log |
+————+
1 row in set (0.02 sec)
设置日志输出方式为文件(默认)(如果设置log_output=table的话,则日志结果会记录到mysql db中名为gengera_log的表中,这表的默认引擎都是CSV,因为general_log 表是一个外部的csv文件,因此对这个表进行查询时性能较低,应修改表的引擎为myisam,提高性能。alter table general_log engine = myisam; ):
root@(none) 09:41:11>set global log_output=file;
Query OK, 0 rows affected (0.00 sec)
设置general log的日志文件路径:
root@(none) 09:45:06>set global general_log_file=’/tmp/general.log’;
Query OK, 0 rows affected (0.00 sec)
开启general log:
root@(none) 09:45:22>set global general_log=on;
Query OK, 0 rows affected (0.02 sec)
过一段时间后,关闭general log:
root@(none) 09:45:31>set global general_log=off;
Query OK, 0 rows affected (0.02 sec)
查看tmp/general.log的信息,可以大致看到哪些sql查询/更新/删除/插入比较频繁了。比如有些表不是经常变化的,查询量又很大,就完全可以cache;对主备延迟要求不高的表,读可以放到备库;等等
在MySql5.1.12之前
在my.cnf或者my.ini中的[mysqld]节下配置:
log = /path/for/file/live-query.log
而在MySql 5.1.12中,需要在上述配置文件中的[mysqld]中配置:
general_log=1
MySql 5.1.29中,包括之后版本(本文处在:5.6.11版本),需要[mysqld]中配置:
general_log=1
general_log_file = /path/for/file/live-query.log
配置后需要重启服务。而这些所有的参数都是可以在线设置的,也就是说,如果你不想因为修改设置而重启MySql的话,那么在线设置应该是个更好的选择,在进入MySql的操作中:
--这里按照最新版本来设置
--查询关于log的设置
SHOW VARIABLES
LIKE
'general_log%'
;
/×
返回结果类似:
+
------------------+------------------------------------------------------------
------------------+
| Variable_name | Value
|
+
------------------+------------------------------------------------------------
------------------+
| general_log |
OFF
|
| general_log_file | dev-mc.log
|
+
------------------+------------------------------------------------------------
------------------+
2
rows
in
set
(0.00 sec)
注意,general_log_file 的默认值是
'机器名'
.log
*/
-- 开启日志
SET
GLOBAL
general_log =
'ON'
;
-- 设置日志的文件路径:本例在Windows下
SET
GLOBAL
general_log_file=
'D:/MySql/live-query.log'
;
-- 设置完之后,就已经生效了
慢速日志(slow log)
General log日志内容比较简单,不包含执行时间或其他只有在查询结束之后才能得到的信息,相反,slow log 记录了这些内容。
慢速日志的确提供了很多有用的信息,但是不代表出现的查询一定一直都是慢的。如果同样的查询在慢速日志里出现了多次,
那么它的确需要优化,但是如果只是出现了偶尔一两次,则有可能是其他客观原因造成的,比如某些锁,I/O磁盘物理性问题,
网络问题等等。
慢速日志的slow_launch_time的时间单位为秒,可以通过网上第三方补丁将其更改为毫秒级,用于更加精细的日志记录和分析,
但是这需要重新编译mysql。
我们通常在日志中查找下面几个信息:长查询、影响比较大的查询和新查询。这可能需要我们自己写一下脚本或是借助某些第三方工具进行日志分析。
General log 系统开销比较大,一般不建议开启。