我们正在挣扎于一个只在第一次调用它时才会发生的缓慢查询。之后,查询要快得多。第一次执行查询时,任何地方都需要15-20秒。随后的调用时间小于1.5秒。但是,如果在几个小时内没有再次调用,则查询将再次花费15-20秒。
该表是一个名为system (外键)的实体的每日读数表,其中包含系统id、日期、样本读取以及是否已完成读取的指示(过去)。查询要求200个选定系统的样本范围为1年(365天)。
看起来是这样的:
SELECT system_id,
sample_date,
reading
FROM Dailyreadings
WHERE past = 1
AND reading IS NOT NULL
AND sample_date < '2014-02-25' AND sample_date >= DATE('2013-01-26')
AND system_id IN (list_of_ids)list_of_ids表示我们希望读取的200个系统ids的列表。
我们有一个关于system_id、sample_date的索引和一个关于这两个方面的索引。查询的结果通常返回70,000行。当在查询上使用explain时,我可以看到使用了索引,并且计划只需要超过70,000行。
MySQL在amazon上。所有表的引擎都是无害的。
Dailyreadings表大约有6000万行,因此它相当大。然而,我不明白一个非常简单的范围查询,可以花多达20秒。这是在只读副本上完成的,所以并发写入不是我猜的问题。这种情况也发生在DB的暂存副本上,该副本同时执行的读/写请求很少。
在阅读了许多关于慢第一次查询的问题之后,我认为问题在于,第一次需要从磁盘读取查询,然后缓存查询。然而,我不明白为什么这样简单的查询需要这么长时间从磁盘读取。我还尝试了许多对innodb参数的调整,但没有得到改进。即使是增加一倍的系统,似乎也没有帮助。
有什么建议可以说明什么是问题吗?以及如何改进第一个查询所需的时间?有什么好办法找出确切的问题吗?
发布于 2014-02-27 12:03:54
查询运行后运行很快,因为mysql可能正在缓存它。若要查看如何在禁用缓存的情况下运行查询,请执行以下操作:SELECT SQL_NO_CACHE system_id ...
此外,我还发现,将表上的日期与大量数据进行比较会对性能产生负面影响。在可能的情况下,我使用unix时间戳将日期保存为it,并比较了这样的日期,并且运行得更快。
https://stackoverflow.com/questions/22067649
复制相似问题