我一直在努力解决一个问题,该问题仅在数据库闲置了一段时间以查询数据时才会发生。第一个查询将非常慢,大约为30秒,然后相关查询将很快为0.1秒。我以为这与缓存有关,但是我一直找不到原因。
将mysql变量tmp_table_size,max_heap_table_size更改为更大的大小没有任何作用,除非在内存中创建临时表。
我认为这与查询本身无关,因为它的索引正确,并且在第一个慢速查询之后,同一查询的变体不会显示在慢速查询日志中。我对尝试确定这种情况的原因或重置有问题的缓存的方式最感兴趣,这样我就可以对问题进行故障排除。
innodb数据文件的页面被缓存在innodb缓冲池中。这就是您所期望的。即使在良好的硬盘驱动器上,读取文件的速度也很慢,尤其是随机读取,这通常是数据库所能看到的。
可能您的第一个查询正在执行某种表扫描,该表扫描将许多页面拉入缓冲池,然后快速访问它们。或类似的东西。
这就是我所期望的。
理想情况下,对所有表使用相同的引擎(例外:系统表,临时表(可能)以及非常小的表或寿命短的表)。如果您不这样做,那么他们必须为公羊而战。
假设所有表都是innodb,则使缓冲池使用服务器物理内存的75%(假设您在计算机上没有执行太多其他任务)。
然后,您将能够将大约12G的数据库装入ram,因此,一旦“预热”了数据库的“最常用”的12G,就会放在ram中,可以轻松,快速地进行访问。
某些mysql用户倾向于在重启后“预热”生产服务器,方法是向它们发送从另一台计算机复制一段时间的查询(这些查询将是复制从属服务器),直到将它们添加到生产池中为止。这样可以避免在高速缓存处于冷状态时看到的极其缓慢的情况。例如,Youtube就是这样做的(或者至少以前是这样做的; Google购买了它们,现在他们可能会使用Google-fu)