我正在运行一个mySQL查询,它连接了500,000多行的各种表。有时需要一秒钟,其他时间大约需要15秒!这是在我的本地机器上。在其他密集查询之前,我经历过类似的不同时期,有谁知道这是为什么?
由于
感谢您的回复 - 我正在使用适当的索引,内部和左侧联接,并且在可能的2年发票期内有一周的WHERE子句范围。如果我继续改变它(因此可能不会缓存查询结果)并重新运行,时间会有很大差异,即使没有。检索到的行类似。服务器不忙。每分钟一些预定的查询,但不是密集的,需要大约200毫秒。
解释计划显示始终完全扫描大约2000行的表格。因此,这些行有时可能会被缓存,或者可能会缓存索引 - 不知道索引是否可以缓存。我将再次尝试关闭缓存。
再次编辑 - 查询缓存实际上是关闭的,我正在使用InnoDB,所以看起来像增加innodb_buffer_pool_size是要走的路
答案 0 :(得分:0)
每次都有相同的查询?
根据您发布的内容,很难说出来。如果我们假设架构和数据没有改变,我猜你的机器上还有其它东西在查询很长时可以解释差异。可能是内存状态不同,因此正在进行分页;一个反病毒程序正在运行;其他一些服务已经开始。回答是不可能的。
答案 1 :(得分:0)
尝试做
优化表
这应该有助于刷新一些对查询规划器有用的数据。
您没有提供太多信息,如果您使用的是MyISAM表,则可能是锁定问题。
您使用的是ANSI INNER JOIN吗?基本没什么,但不要使用“交叉连接”。这些是与逗号的连接,如
SELECT * FROM t1, t2 WHERE t1.id_t1=t2.id_t1
您可能想要尝试的最后一件事。增加缓冲区(innodb),key_buffers(myisam)和一些查询缓存缓冲区。
答案 2 :(得分:0)
这是一些常见的原因(禁止你的服务器太忙)
慢速查询正在击中硬盘。在快速的情况下,索引和数据已经缓存在MySQL或OS文件缓存中。
检索数据被更新/插入锁定,对于MyISAM表,只要有人在某些情况下插入/更新数据,整个表就会被锁定。
表统计信息已过期和/或选择了错误的索引。在桌面上运行analyze
或optimize
可以提供帮助。
您启用了查询缓存,获取缓存查询的结果很快,如果缓存不在缓存中则可能很慢。尝试关闭查询缓存,以检查查询是否总是很慢,如果它没有从缓存中提取。
在任何情况下,您都应该在查询中显示EXPLAIN
的输出以验证索引是否得到了正确使用 - 即使它们不正确,如果所有内容都在ram中但是停止查询可能会很快查询如果它需要击中硬盘驱动器。