gpt4 book ai didi

mysql - 禁用 mysql 缓存

转载 作者:行者123 更新时间:2023-11-29 02:02:55 24 4
gpt4 key购买 nike

我需要禁用 mysql 查询缓存以测试查询速度。我已经尝试过以下但没有成功

  1. 从表中选择 SQL_NO_CACHE col1, col2
  2. 将配置变量 query_cache_size 设为 0和 'query_cache_type' 关闭所以所有的 qcache 变量都显示为零显示类似 '%qcache%' 的状态;
    Qcache_free_blocks 0Qcache_free_memory 0Qcache_hits 0Qcache_inserts 0Qcache_lowmem_prunes 0Qcache_not_cached 0Qcache_queries_in_cache 0Qcache_total_blocks 0

3.used 'reset query cache', 'flush query cache', flush tables;也但我的查询仍然比第一次运行得更快,这意味着它正在缓存。

4.所有 qcache 变量始终保持为零。我错过了什么?请帮忙。

最佳答案

您观察到相同查询的后续执行运行得更快并不一定意味着查询结果被缓存,或者查询的后续执行从查询缓存中返回。

可能是在第一次执行查询时,必须访问的索引和/或数据 block 不在 InnoDB 缓冲池或 MyISAM 键缓存中,必须从磁盘中检索。这些 block 将保留在 InnoDB 缓冲池和 MyISAM 键缓存中,完全独立于 MySQL 查询缓存。如果这些 block 仍在内存中,则对这些 block 的后续访问可以更快地返回。


通常,您不想从 InnoDB 缓冲池或 MyISAM key 缓存中刷新 block 来衡量性能。相反,您想多次运行查询,并在第一次执行时抛出时间。

如果你想从 InnoDB 缓冲池或 MyISAM 键缓存中没有 block 开始,然后关闭并重新启动 MySQL 服务器。

但即使这些 block 不在 InnoDB 缓冲池或 MyISAM 键缓存中,这些 block 也可能仍在操作系统文件系统缓存的“内存”中。因此,为确保您从磁盘读取 block ,您还需要刷新操作系统文件系统缓存。


以下是 Tom Kyte (AskTom) 一篇关于 Oracle 的文章的节选,但同样的推理也适用于其他 RDBMS 系统(包括 MySQL)。

http://www.oracle.com/technetwork/issue-archive/o43asktom-094944.html

刷新缓存

问:有没有办法刷新[缓冲区缓存]? ...这对于一个接一个地尝试多种方法的调整练习很重要,但我们希望在不重新启动数据库的情况下减少缓冲区中预先存在的 block 的影响。

答: 实际上,重要的是调整工具不要这样做。重要的是运行测试,忽略结果,然后运行 ​​2 到 3 次并对这些结果进行平均。在现实世界中,缓冲区缓存永远不会没有结果。绝不。调整时,您的目标是减少逻辑 I/O (LIO),因为这样物理 I/O (PIO) 就会自行处理。

考虑一下:刷新共享池和缓冲区缓存比不刷新它们更加人为。大多数人似乎对此持怀疑态度,我怀疑,因为它与传统智慧背道而驰。我将向您展示如何执行此操作,但不是为了让您可以将其用于测试。相反,我将用它来证明为什么它是徒劳且完全人为的练习(因此会导致错误的假设)。我刚刚启动了我的 PC,并且针对一个大表运行了这个查询。我“刷新”缓冲区缓存并再次运行它:

关于mysql - 禁用 mysql 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11746780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com