查询缓存将
SELECT
语句的文本与发送到客户端的相应结果一起存储。如果稍后收到相同的语句,服务器会从查询缓存中检索结果,而不是再次解析和执行该语句。查询缓存在会话之间共享,因此可以发送一个客户端生成的结果集以响应另一个客户端发出的相同查询。
查询缓存在您拥有不经常更改的表并且服务器收到许多相同查询的环境中很有用。这是许多基于数据库内容生成许多动态页面的 Web 服务器的典型情况。
查询缓存不返回陈旧数据。当表被修改时,查询缓存中的任何相关条目都会被刷新。
查询缓存在您有多个更新相同
表
的mysqld服务器
的环境中不起作用。MyISAM
在第 8.10.3.1 节,“查询缓存如何操作” 中描述的条件下,查询缓存用于准备好的语句。
分区表不支持查询缓存,并且对于涉及分区表的查询会自动禁用。无法为此类查询启用查询缓存。
查询缓存的一些性能数据如下。这些结果是通过在具有 2GB RAM 和 64MB 查询缓存的 Linux Alpha 2×500MHz 系统上运行 MySQL 基准测试套件生成的。
如果您执行的所有查询都很简单(例如从只有一行的表中选择一行),但仍然不同以致无法缓存查询,则激活查询缓存的开销为 13%。这可以被视为最坏的情况。在现实生活中,查询往往要复杂得多,因此开销通常要低得多。
使用查询缓存在单行表中搜索单行的速度比没有查询缓存快 238%。这可以被视为接近缓存查询预期的最小加速。
要在服务器启动时禁用查询缓存,请将
query_cache_size
系统变量设置为 0。通过禁用查询缓存代码,没有明显的开销。
查询缓存提供了显着提高性能的潜力,但不要假设它在所有情况下都会这样做。对于某些查询缓存配置或服务器工作负载,您实际上可能会看到性能下降:
在将查询缓存的大小设置得过大时要小心,这会增加维护缓存所需的开销,可能超出启用它的好处。几十兆字节的大小通常是有益的。数百兆字节的大小可能不是。
服务器工作负载对查询缓存效率有重大影响。几乎完全由一组固定语句组成的查询组合比频繁语句导致缓存中结果持续失效的
SELECT
组合更有可能从启用缓存中获益 。INSERT
在某些情况下,一种解决方法是使用该SQL_NO_CACHE
选项来防止结果甚至进入SELECT
使用频繁修改的表的语句的缓存。(请参阅 第 8.10.3.2 节,“查询缓存选择选项”。)
要验证启用查询缓存是否有益,请在启用和禁用缓存的情况下测试 MySQL 服务器的操作。然后定期重新测试,因为查询缓存效率可能会随着服务器工作负载的变化而变化。