何时不使用 MySQL 查询缓存

在具有许多快速查询和许多 CPU 内核的服务器中,应禁用查询缓存。
查询缓存在单个线程中运行,并且会严重限制服务器中的吞吐量。
以下是理想情况下不应使用查询缓存的场景列表。

大量快速查询和多个 CPU 内核

大多数运行 MySQL 的服务器使用多个 CPU 内核。
在这些服务器中使用 MySQL 查询缓存会严重降低性能。

多次写入、更新或者删除

与查询缓存相关的开销会降低性能。

许多不同的 SELECT 查询

每个结果集都需要在查询缓存中建立索引。
如果查询缓存中存储了更多完整的结果集,则性能提升将更小。

锁定表

在解析查询之前检查查询缓存,这可能导致在服务器检查表是否被锁定之前输出先前的结果集。
当打开 query_cache_wlock_invalidate 系统变量时,如果查询缓存使用的任何对象对其执行了写锁定,则查询缓存将失效。

on  it road.com

何时使用 MySQL 查询缓存

以下是我们可以使用 MySQL 查询缓存功能的情况:

  • 当数据库必须对同一数据集重复运行相同的查询时。它使 MySQL 服务器不必一遍又一遍地检索相同的数据集。
  • 当结果集相对较小且可由查询缓存管理时。在查询缓存中拥有大量结果集会对性能产生负面影响。
  • 同时阅读密集的网络应用程序、教程 、电子商务应用程序、AD应用程序等。

MySQL 查询缓存状态变量

我们可以在 SHOW STATUS 中监控查询缓存性能:

Qcache_hits

显示从查询缓存传送结果的次数

Qcache_inserts

显示结果存储到查询缓存的次数。
如果查询缓存命中次数少而查询缓存插入次数多,则应禁用查询缓存。

Qcache_lowmem_prunes

显示由于内存不足而从查询缓存中删除的存储结果集数。
如果此数字很高,我们可以增加查询缓存大小。

Qcache_free_blocks

显示查询缓存中可用的连续内存块数。
新查询的分配时间与在此系统变量中输入的值成正比。

Qcache_free_memory

显示查询缓存的可用内存量。
如果可用内存较小(相对于查询缓存大小),则应增加查询缓存大小。

Qcache_not_cached

显示其结果集未存储在查询缓存中的 SELECT 查询的数量。
这些查询可能已被排除在查询缓存之外,因为它们不可缓存或者基于 query_cache_type 设置的设置。

Qcache_queries_in_cache

显示当前存储在缓存中的查询结果集的数量。

com_select

显示 MySQL 服务器执行的 SELECT 语句数。
这不包括从查询缓存提供的查询。
比较 Com_select 和 Qcache_hits 表明服务器上查询缓存的效率。
将 Com_select 和 Qcache_hits 状态值相加以获得对服务器执行的 SELECT 语句的数量。

什么是 MySQL 查询缓存

MySQL服务器长期使用Query Cache Feature。
使用时,查询缓存将 SELECT 查询的文本与发送到客户端的相应结果一起存储。
如果接收到另一个相同的查询,则服务器可以从查询缓存中检索结果,而不是再次解析和执行相同的查询。

它缓存从 SELECT 查询产生的完整结果集:

  • 执行的查询必须相同。
  • 缓存存储在系统内存中。
  • 在解析查询之前检查缓存。

关联的表更新使查询缓存结果无效。
可以缓存准备好的语句,但存在限制。
一些不使用查询缓存的语句是:

  • 使用非确定性函数的查询。
  • 作为外部查询的子查询的查询
  • 在存储的函数、触发器或者事件的主体内执行的查询

改进查询缓存结果

标准化针对服务器执行的查询。
如果可能,请删除任何阻止查询缓存能够存储结果集的内容。

尽量减少数据更新的次数和频率。
一起批量更新以最大限度地减少查询缓存结果集频繁失效。

MySQL 查询缓存设置

查询缓存为 mysqld 添加了一些 MySQL 系统变量,这些变量可以在配置文件中设置,在启动 mysqld 时的命令行上:

1. query_cache_type

可以设置三个单独的选项:

  • 0 或者 OFF :这通过不缓存查询结果或者从查询缓存中检索结果来停止查询缓存。
  • 1 或者 ON :缓存所有可缓存的查询结果,但那些以 SELECT SQL_NO_CACHE 开头的结果除外……这是向后兼容的默认选项。
  • 2 或者 DEMAND :仅缓存以 SELECT SQL_CACHE ... 开头的可缓存查询的结果

使用 -query-cache-type=0 启动 MySQL 服务器不会获取查询缓存互斥锁,从而减少了查询执行过程中的开销。
最多可提高 13%。

2. query_cache_size

为缓存查询结果分配的内存量:

  • 默认值为 0,即禁用查询缓存。
  • 将此值设置得太低(小于大约 40 KB)会导致发出警告。
  • 将此值设置得太大会导致所有查询被阻止,同时使更改表的结果无效。
  • 所有值都应以 1024 的倍数输入。任何其他值将向下舍入到最接近的倍数。
  • 在大多数生产服务器上,8 MB 就可以了。但是如果有足够的证据支持使用这么大的值,128 MB 到 200 MB 也是可以接受的。

query_cache_limit

要缓存的最大结果集大小。
默认值为 1 MB。
将其保持在合理的数字(1 MB 到 2 MB)可避免由于存储的大型查询而擦除整个查询缓存。
实际大小取决于应用程序需求和 SELECT 结果集大小。

MySQL 查询缓存
日期:2020-09-17 00:11:06 来源:oir作者:oir