8.10.3 MySQL 查询缓存

Note

从 MySQL 5.7.20 开始,查询缓存已弃用,并在 MySQL 8.0 中删除。

查询缓存将SELECT语句的文本以及发送到 Client 端的相应结果存储在一起。如果以后收到相同的语句,则服务器从查询缓存中检索结果,而不是再次解析并执行该语句。查询缓存在会话之间共享,因此可以响应另一个 Client 端发出的同一查询来发送一个 Client 端生成的结果集。

查询缓存在您的 table 不经常更改且服务器接收许多相同查询的环境中很有用。这是许多 Web 服务器基于数据库内容生成许多动态页面的典型情况。

查询缓存不返回陈旧的数据。修改 table 后,将刷新查询缓存中的所有相关条目。

Note

查询缓存在具有多个mysqld服务器更新同一MyISAMtable 的环境中不起作用。

查询缓存用于第 8.10.3.1 节,“查询缓存的操作方式”中描述的条件下的准备好的语句。

Note

分区 table 不支持查询缓存,而涉及分区 table 的查询将自动禁用查询缓存。无法为此类查询启用查询缓存。

以下是查询缓存的一些性能数据。这些结果是通过在具有 2GB RAM 和 64MB 查询缓存的 Linux Alpha 2×500MHz 系统上运行 MySQL 基准套件而产生的。

  • 如果您正在执行的所有查询都很简单(例如从具有一行的 table 中选择一行),但是仍然不同,以致无法缓存查询,那么使查询缓存处于活动状态的开销为 13%。这可以被认为是最坏的情况。在现实生活中,查询往往要复杂得多,因此开销通常会大大降低。

  • 使用查询缓存,单行 table 中的单行搜索比没有查询时快 238%。这可以视为接近缓存查询所期望的最小加速。

要在服务器启动时禁用查询缓存,请将query_cache_size系统变量设置为 0.通过禁用查询缓存代码,没有明显的开销。

查询缓存提供了显着提高性能的潜力,但不要假设它在所有情况下都可以这样做。使用某些查询缓存配置或服务器工作负载,实际上可能会看到性能下降:

  • 对于过大的查询缓存,请谨慎设置大小,这会增加维护缓存所需的开销,可能超出启用缓存的好处。通常,数十兆字节的大小是有益的。大小可能不会达到数百兆字节。

  • 服务器工作负载对查询缓存效率有重大影响。几乎完全由固定的一组SELECT语句组成的查询混合比启用频繁的INSERT语句导致缓存中的结果连续无效的混合更有可能从启用缓存中受益。在某些情况下,一种解决方法是使用SQL_NO_CACHE选项来防止结果甚至进入使用频繁修改的 table 的SELECT语句的缓存。 (请参见节 8.10.3.2,“查询缓存选择选项”。)

为了验证启用查询缓存是否有用,请在启用和禁用缓存的情况下测试 MySQL 服务器的操作。然后定期重新测试,因为查询缓存效率可能随服务器工作负载的变化而变化。