如何清除MYSQL中的缓存?

4
我想多次运行相同的查询,以查看它在没有缓存内存的情况下需要多少时间。 运行 RESET QUERY CACHE 命令似乎不起作用,因为即使在缓存重置后,查询在第二次运行时也需要非常短的时间。 我错过了什么?
4个回答

3

您的操作系统会缓存大量数据。然后,数据库管理系统本身也会缓存大量数据。查询缓存仅保存先前查询的输出。查询输出所创建的数据可能全部在RAM中。如果您想在没有任何缓存的情况下运行查询,则可以在执行之间关闭主机或运行一个从磁盘读取足够数据以覆盖所有缓存的查询。但这不会是衡量查询在实际环境中表现的真实措施。


3

查询受到两个“缓存”的影响。 查询缓存(Query Cache)缓冲池(Buffer Cache,InnoDB使用)或关键缓存(MyISAM使用)。 由于它可以缓存查询结果,因此查询缓存的影响远大于缓冲池。 这意味着相同的查询将不会再次执行。

为了避免使用查询缓存,最好使用SQL_NO_CACHE,并可以在my.cnf中禁用查询缓存并重新启动mysql。

缓冲池由mysql管理以将数据缓存在内存中,从而使查询不必从磁盘(SSD或HDD)中读取数据。 如果您想清除它,请尝试将'缓冲池'设置得足够小,并使用其他数据填充它(使用SELECT)。


2
你可以在SELECT查询中使用SQL_NO_CACHE。

https://dev.mysql.com/doc/refman/5.5/en/query-cache-in-select.html

请记住,MySQL 的后续版本中已经删除了查询缓存。
根据存储引擎(例如 InnoDB),它会将表数据作为缓冲池的一部分加载到内存中。这一部分你无法控制哪些表要加载,哪些表不加载(或者至少不容易控制)。

只是在我的选择中添加SQL_NO_CACHE实际上并不起作用。查询在第二次运行时总是更快。 - jimmy_code
这是因为一些数据,而不是确切的查询结果,会被缓存在InnoDB缓冲池中。所以当下次执行查询时,MySQL只会从内存中扫描数据。与正常的磁盘读取相比,这将快上许多个数量级。因此,在第二次运行中,您将看到更快的查询执行时间。如果您想获取有关查询执行的更多详细信息,请尝试对查询进行分析。 https://dev.mysql.com/doc/refman/5.7/en/performance-schema-examples.html - Jigar Patel

0
在一个古老的MySQL版本(v.5.1)中,我遇到了一个问题,即视图被缓存后永远不会刷新。我尝试了RESET QUERY CACHEFLUSH TABLESSELECT SQL_NO_CACHE...等方法,但都没有起作用。然后,我将此视图中查询的底层(单个)表的存储引擎从InnoDB更改为MyISAM,它隐式地按预期工作了!无需跳过任何障碍来清除或防止缓存!
我不确定这是否仅是旧版本/存储引擎的错误?如果您对此事有任何知识要分享,请留下评论。

这很明显是因为“缓存”数据存储在InnoDB缓冲区中。 - jimmy_code
我尝试清除缓存/缓冲区的所有方法都无法按定义与innodb一起使用? - BuvinJ
我认为你只能通过重启服务器或mysqld来重置innodb缓冲区。 - jimmy_code
那么,我希望至少可以关闭并重新打开连接/会话来解决这个问题?如果一个视图不能在不重启整个数据库服务的情况下进行刷新,那么它通常会非常无用。 - BuvinJ
这就是它的本质,我的朋友 :D - jimmy_code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接