【发布时间】:2017-06-04 10:11:18
【问题描述】:
我正在尝试在可接受的时间内在大型数据库上运行查询。我正在考虑优化查询本身(例如Clarification of join order for creation of temporary tables),这使我从根本无法完成查询(有 20 小时上限)到完成它,但时间仍然不可接受。
在实验中,我发现了以下我想了解的奇怪行为:我想在 2 年的时间范围内进行查询。如果我尝试直接这样运行它,那么它仍然不会在我允许测试的 10 分钟内完成。如果我将它减少到该范围的前 6 个月,它将很快完成。如果我然后通过在范围内添加几个月来逐步重新运行查询(即运行 8 个月,然后运行 10 个月,直到整整 2 年),每次连续尝试都将完成,我可以引导我的方式能够得到我想要的整整两年。
我怀疑这可能是由于 MySQL 服务器缓存了结果,但这似乎与文档不匹配:
如果稍后收到相同的语句,则服务器从查询缓存中检索结果,而不是再次解析和执行该语句。
http://dev.mysql.com/doc/refman/5.7/en/query-cache.html
那里的关键词似乎是“相同的”,并且查询相同的明显要求被我所做的其他阅读强化了。 (The docs 甚至表明查询上的比较是字面的,以至于用“SELECT”与“select”编写的逻辑等效查询将不匹配。)在我的情况下,每个后续查询都包含前一个查询的全部范围查询,但没有两个是相同的。
此外,表格会在一夜之间更新。因此,昨天结束时,我们在 19 秒内运行了完整的 2 年查询,大概是因为我们已经至少获得了一次完整结果,所以它被缓存了。今天我们不能再让查询运行了,这似乎与昨晚更新表时缓存已失效的情况一致。
所以问题是:在这种情况下是否有一些特殊情况允许服务器缓存?如果是,那记录在哪里?如果没有,还有什么其他会导致这种行为的建议?
【问题讨论】:
标签: mysql database caching select query-cache