首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对大型MySQL表的简单查询一开始需要很长时间,之后要快得多

对大型MySQL表的简单查询一开始需要很长时间,之后要快得多
EN

Stack Overflow用户
提问于 2014-02-27 11:49:37
回答 1查看 1.4K关注 0票数 1

我们正在挣扎于一个只在第一次调用它时才会发生的缓慢查询。之后,查询要快得多。第一次执行查询时,任何地方都需要15-20秒。随后的调用时间小于1.5秒。但是,如果在几个小时内没有再次调用,则查询将再次花费15-20秒。

该表是一个名为system (外键)的实体的每日读数表,其中包含系统id、日期、样本读取以及是否已完成读取的指示(过去)。查询要求200个选定系统的样本范围为1年(365天)。

看起来是这样的:

代码语言:javascript
复制
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参数的调整,但没有得到改进。即使是增加一倍的系统,似乎也没有帮助。

有什么建议可以说明什么是问题吗?以及如何改进第一个查询所需的时间?有什么好办法找出确切的问题吗?

  • 编辑问题似乎是在in子句中,因为列表是大(200)项?这是众所周知的问题吗?有什么办法可以加速这件事吗?
EN

回答 1

Stack Overflow用户

发布于 2014-02-27 12:03:54

查询运行后运行很快,因为mysql可能正在缓存它。若要查看如何在禁用缓存的情况下运行查询,请执行以下操作:SELECT SQL_NO_CACHE system_id ...

此外,我还发现,将表上的日期与大量数据进行比较会对性能产生负面影响。在可能的情况下,我使用unix时间戳将日期保存为it,并比较了这样的日期,并且运行得更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22067649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档