我正在运行mysql 5.5并正在调试性能问题。我启用了mysql慢速日志记录。这些是我在my.cnf中的相关设置:
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 10
log-queries-not-using-indexes
Mysql确实在创建和写入慢查询日志。但是,它记录了大量运行的查询,这些查询比long_query_time参数指定的要快得多。
以下是几个例子:
# Query_time: 0.000142 Lock_time: 0.000039 Rows_sent: 1 Rows_examined: 1
# Query_time: 0.000081 Lock_time: 0.000024 Rows_sent: 1 Rows_examined: 1
# Query_time: 0.000116 Lock_time: 0.000034 Rows_sent: 1 Rows_examined: 1
实际上,没有查询的实例具有查询或锁定时间,这些查询或锁定时间一起加起来大于0.1。从我读取long_query_time参数应该做什么,我不希望在慢查询日志中找到这些查询。
答案 0 :(得分:4)
编辑my.cnf不会将更改应用于正在运行的实例。您必须重启mysvicef的MySQL服务才能生效。
或者,您可以使用SET GLOBAL long_query_time = 10
在当前运行的实例中应用等效更改。
我的习惯是两者:编辑my.cnf以便下次重启MySQL服务时生效,然后我也使用SET GLOBAL
来应用相同的更改到正在运行的实例。了解并非每个MySQL服务器变量都可以像这样动态更改。
另请注意,只有 new 客户端连接才能获得该全局值。现有客户端连接将继续使用在连接开始时生效的先前全局值。
重新评论:
请注意,您设置了log-queries-not-using-indexes。这意味着记录所有不使用索引的查询,即使查询比long_query_time更快。
https://dev.mysql.com/doc/refman/5.5/en/slow-query-log.html说:
服务器按以下顺序使用控制参数 确定是否将查询写入慢查询日志:
查询必须不是管理声明,或者 必须指定--log-slow-admin-statements。
查询必须至少使用long_query_time秒,或者 必须启用log_queries_not_using_indexes,并且查询不使用 行查找的索引。
查询必须至少检查过min_examined_row_limit行。
请注意,“不使用索引”有点违反直觉。 https://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_log-queries-not-using-indexes说:
[log-queries-not-using-indexes]选项并不一定意味着不使用索引。例如,使用完整索引扫描的查询使用索引但会被记录,因为索引不会限制行数。