2010-06-12 125 views
0

我正在运行一个mySQL查询,它连接了500,000多行的各种表。有时需要15秒钟,其他时间需要一秒钟!这是在我的本地机器上。我在其他密集查询之前经历过类似的不同时间,有谁知道这是为什么?mySQL不一致的性能

感谢

感谢您的答复 - 我使用合适的索引,内部和左连接和有一周的WHERE子句范围内进行可能2年期发票的。如果我不断改变它(所以大概查询结果没有被缓存)并且重新运行,时间变化很大,即使没有。检索到的行类似。服务器不忙。每分钟但不是密集的几个计划查询需要大约200毫秒。

解释计划显示总是对2000行左右的表进行全面扫描。所以也许这些行有时被缓存,或者索引被缓存 - 不知道索引可以被缓存。我将再次尝试缓存关闭。

编辑再次 - 查询缓存其实关,我使用的是InnoDB所以看起来增加innodb_buffer_pool_size是路要走每次

+0

问题不够具体,有用的答案,请重构:) – MarkR 2010-06-13 11:59:25

回答

0

相同的查询?

根据你发布的内容很难说。如果我们假设模式和数据没有改变,我猜测当查询很长时,您的机器上还会运行其他内容,这可以解释这种差异。这可能是内存状态不同,所以分页正在进行;一个反病毒程序正在运行;一些其他服务已经开始。这是不可能回答的。

0

尝试做一个

OPTIMIZE TABLE

这将有助于刷新一些用于查询规划有用的数据。

如果你使用MyISAM表,你还没有给我们提供太多的信息,这可能是一个锁。

您是否在使用ANSI INNER JOIN?基本不多,但不要使用“交叉连接”。这些是与逗号连接,如

SELECT * FROM t1, t2 WHERE t1.id_t1=t2.id_t1 

最后的事情,你可能想尝试。增加你的缓冲区(innodb),你的key_buffers(myisam)和一些查询缓存缓冲区。

0

下面是一些常见的原因(BAR您的服务器只是太忙)

  • 慢速查询的击球硬盘。在快速情况下,索引和数据已经被缓存在MySQL或OS文件缓存中。

  • 检索数据被更新/插入锁定,对于MyISAM表,当有人在某些情况下插入/更新数据时,整个表会被锁定。

  • 表统计信息已过期和/或选择了错误的索引。在桌面上运行analyzeoptimize可以提供帮助。

  • 您已启用查询缓存,获取缓存查询的结果很快,如果缓存查询的结果不在缓存中,则缓存可能会很慢。尝试关闭查询缓存以检查查询是否总是缓慢,如果它没有从缓存中获取。

在任何情况下,你应该表现出你的查询EXPLAIN输出验证指标得到正确使用 - 即使他们没有,查询可以快速,如果一切都在RAM中,但逐渐停顿下来如果它需要击中hardddrive。