我有一个带有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条记录。知道为什么这些长时间运行,看似无用的查询会运行吗?
感谢。
答案 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.controller
和pages.action
上有索引键?
该表可能包含很多条目,因此如果您没有实现索引键,查询需要3.47秒才能逐个查找正确的行。