MySQL缓慢查询,发送/检查的行等于0

时间:2011-08-09 17:28:05

标签: mysql ruby-on-rails performance

我有一个带有MySQL数据库的Rails(v.2.3.8)应用程序。在数据库服务器上的慢查询日志中,有大量条目,例如:

# Query_time: 3.471884  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
use prod;
SET timestamp=1312909843;
SELECT * FROM `pages` WHERE (`pages`.`controller` = 'forum_categories' AND `pages`.`action` = 'show')  LIMIT 1;

请注意,查询时间是3.47秒,而发送和检查的行数都是0.当我使用MySQL客户端(MySQL服务器和应用程序服务器上)运行相同的查询时,我得到了一个结果不到100毫秒。所有必要的表字段都被编入索引,表中只有70条记录。知道为什么这些长时间运行,看似无用的查询会运行吗?

感谢。

2 个答案:

答案 0 :(得分:3)

  

以下是慢查询日志中的示例:

1 # Time: 030303 0:51:27
2 # User@Host: root[root] @ localhost []
3 # Query_time: 25 Lock_time: 0 Rows_sent: 3949 Rows_examined: 378036
4 SELECT ...
     

第1行显示记录查询的时间,第2行显示执行的人员   它。第3行显示执行所需的秒数,它需要多长时间   等待MySQL服务器级别的表锁(不在存储区   引擎级别),...

     

注意不要在慢速查询日志中过多地阅读。如果你看到   在日志中多次查询相同的查询,很有可能   慢,需要优化。但只是因为查询出现在   日志并不意味着它是一个糟糕的查询,甚至不一定是一个慢的查询。   你可能会发现一个慢查询,自己运行它,并发现它在几分之一秒内执行。在日志中出现只是意味着   查询花了很长时间;这并不意味着需要很长时间   现在或将来。查询可能很慢的原因有很多   有时候在其他时间很快:
  •桌子可能已被锁定,   导致查询等待。 Lock_time指示了多长时间   查询等待释放锁   •数据或索引可能不会   已被缓存在记忆中了。当MySQL是第一个时,这很常见   开始或没有很好地调整   •夜间备份过程可能有   一直在运行,使所有磁盘I / O变慢   •服务器可能已经存在   同时运行其他查询,减慢此查询速度   作为一个   结果,您应该将慢查询日志视为仅部分记录   发生了什么。您可以使用它来生成可能的列表   怀疑,但你需要更深入地调查每一个。

这些数据引自本书: “高性能MySQL:优化,备份,复制等,第二版,作者:Baron Schwartz等。 版权所有2008 O'Reilly Media,Inc.,9780596101718。“

答案 1 :(得分:0)

您是否在列pages.controllerpages.action上有索引键?

该表可能包含很多条目,因此如果您没有实现索引键,查询需要3.47秒才能逐个查找正确的行。