Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子集查询的MySQL缓存_Mysql_Database_Caching_Select_Query Cache - Fatal编程技术网

子集查询的MySQL缓存

子集查询的MySQL缓存,mysql,database,caching,select,query-cache,Mysql,Database,Caching,Select,Query Cache,我正在尝试在可接受的时间内在大型数据库上运行查询。我正在考虑优化查询本身(例如),从根本无法完成查询(上限为20小时)到完成查询,但时间仍然不可接受 在实验中,我发现了以下我想理解的奇怪行为:我想在2年的时间范围内进行查询。如果我试着直接这样运行它,那么它仍然不会在允许测试的10分钟内完成。如果我将它减少到范围的前6个月,它将很快完成。如果我随后通过在范围中添加几个月(即运行8个月,然后10个月,直到整整2年)以增量方式重新运行查询,则每次连续尝试都将完成,并且我可以引导我的方式,以获得我想要的

我正在尝试在可接受的时间内在大型数据库上运行查询。我正在考虑优化查询本身(例如),从根本无法完成查询(上限为20小时)到完成查询,但时间仍然不可接受

在实验中,我发现了以下我想理解的奇怪行为:我想在2年的时间范围内进行查询。如果我试着直接这样运行它,那么它仍然不会在允许测试的10分钟内完成。如果我将它减少到范围的前6个月,它将很快完成。如果我随后通过在范围中添加几个月(即运行8个月,然后10个月,直到整整2年)以增量方式重新运行查询,则每次连续尝试都将完成,并且我可以引导我的方式,以获得我想要的整整两年

我怀疑这可能是因为MySQL服务器缓存了结果,但这似乎与文档不符:

如果稍后收到相同的语句,服务器将从查询缓存中检索结果,而不是再次解析和执行该语句

这里的关键词似乎是“相同的”,而我所做的其他阅读又迫使我提出了查询必须相同的明显要求。(甚至指出查询上的比较是字面的,以至于用“SELECT”和“SELECT”编写的逻辑等价查询不匹配。)在我的例子中,每个后续查询都包含前一个查询的完整范围,但没有两个是相同的

此外,表会在夜间更新。因此,在昨天的一天结束时,我们在19秒内运行了完整的、2年的查询,据推测,它被缓存了,因为到那时我们至少获得了一次完整的结果。今天,我们无法再运行查询,这似乎与昨晚更新表时缓存失效的情况一致


所以问题是:在这种情况下,是否存在允许服务器缓存的特殊情况?如果是,记录在哪里?如果没有,还有什么建议会导致这种行为?

是的,有一个缓存可以优化(常规)对硬盘的访问。它实际上是每个基于存储的数据库系统的一个非常重要的部分,因为从硬盘读取数据(或将临时数据写入硬盘)通常是大多数查询最相关的瓶颈

对于InnoDB,这称为:

InnoDB维护一个称为缓冲池的存储区域,用于在内存中缓存数据和索引。了解InnoDB缓冲池的工作原理,并利用它将频繁访问的数据保存在内存中,这是MySQL调优的一个重要方面。有关InnoDB缓冲池如何工作的信息,请参阅InnoDB缓冲池LRU算法

您可以配置InnoDB缓冲池的各个方面以提高性能

  • 理想情况下,您可以将缓冲池的大小设置为尽可能大的值,从而为服务器上的其他进程留出足够的内存,以便在不进行过度分页的情况下运行缓冲池越大,InnoDB就越像内存中的数据库,从磁盘读取一次数据,然后在后续读取期间从内存访问数据。请参阅第15.6.3.2节“配置InnoDB缓冲池大小”
可能有(并且已经有)关于的书籍,它是如何工作的,以及如何工作的,所以我将到此为止,只留下这个关键字给您,并让您参考文档

基本上,后续读取会将数据添加到缓存中,这些数据可以重复使用,直到被其他数据替换(在您的情况下,这是第二天发生的)。由于(对于MySQL)这可以是对相关表的任何读取,并且不必是复杂的查询,因此它可能会使“预取”更容易


尽管以下是免责声明,因为如果您更改配置,它显然会对您的服务器产生负面影响:默认的MySQL配置非常(非常)保守,例如,对于大多数15年以下的服务器来说,系统设置太低,所以可以查看您的配置(或者让您的系统管理员检查).

我们做了一些实验,包括检查@Solarflare在回答中提到的系统的效果。在我们的案例中,我们得出结论,表面上的缓存是真实的,但与MySQL无关。它是由Linux磁盘缓存引起的。在我们的案例中,我们可以通过在之后手动刷新该缓存来验证这一点在得到结果和比较时间之前。

谢谢你的回答。经过一些实验,在我们的例子中,它似乎是操作系统级别的文件系统缓存,与MySQL完全无关。