我注意到,当我在我的 mysql 机器上连续多次执行查询时,执行时间在第一次执行后会下降并发生显着变化(40/50%),并且没有激活查询缓存并且没有其他进程干扰。
我怀疑其中涉及一些“隐藏”的缓存,比如临时表,特别是当查询涉及多个子查询时,或者可能是一些磁盘 IO 缓存,但我真的不明白。
由于有时我需要微调某些查询,所以我不知道如何处理这个问题。我通常会多次运行查询并消除峰值
我想知道是否有更好的解决方案...
答案1
操作系统使用未使用的内存作为缓存。为什么这是一个问题?
编辑
要获取查询操作不同部分所花费的时间,可以使用以下方式设置分析
set profiling=1;
show profiles
并show profile for query <n>
在运行查询后显示配置文件 。
答案2
正如前面提到的,请谨慎对待您的优化目标:当您优化重复运行的查询时,您将获得短时间内多次运行的查询的最佳结果(但您可能会为此使用查询缓存)。
通过重复查询,您可以“预热”操作系统磁盘缓存,因此磁盘寻道不再计入您的时间。当需要在繁忙的磁盘上执行多次寻道操作时,这可能会严重恶化您在实际场景中的结果。
附注:您可能还想尝试“explain select...”,它将告诉您有关已使用和可用的索引的信息。在大多数情况下,这将帮助您确定要创建哪些附加索引或如何重写查询。