千家信息网

MySQL query_cache_type的DEMAND参数介绍和使用举例

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,Query Cache存储SELECT语句及其产生的数据结果,特别适用于表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生 变化的信息。如果此表上有任何写表操作发生,那么和这个表
千家信息网最后更新 2025年11月07日MySQL query_cache_type的DEMAND参数介绍和使用举例

Query Cache存储SELECT语句及其产生的数据结果,特别适用于表数据变化不是很频繁的场景,例如一些静态页面,

或者页面中的某块不经常发生 变化的信息。如果此表上有任何写表操作发生,那么和这个表相关的所有缓存都将失效。

由于Query Cache需要缓存最新数据结果,因此表数据 发生任何变化(INSERT、UPDATE、DELETE或其他有可能产生

数据变化的操作),都会导致Query Cache被刷新。对于更新压力大的数据库来说,查询缓存的命中率也会非常低。

但我们可以将参数 query_cache_type 设置成 DEMAND(按需及用)方式,这样对于默认的SQL语句不使用查询缓存,

而对于确定要使用query cache的SQL语句, 可以用sql_cache的方法指定,例如:

select sql_cache * from table_name;

或 select sql_cache count(*) from table_name;



以下是query_cache_type三个参数的含义:


query_cache_type=0(OFF)关闭


query_cache_type=1(ON)缓存所有结果,除非select语句使用SQL_NO_CACHE禁用查询缓存


query_cache_type=2(DEMAND),只缓存select语句中通过SQL_CACHE指定需要缓存的查询


修改为DEMAND方式:

vi /etc/my.cnf,加入如下行:

query_cache_type =2


保存并重启mysql


mysql5.7版本如果直接修改可能会报错:

mysql>set global query_cache_type=2;

ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it



查看是否开启DEMAND参数:

mysql>show variables like '%query_cache%';

+------------------------------+---------+

| Variable_name | Value |

+------------------------------+---------+

| have_query_cache | YES |

| query_cache_limit | 1048576 |

| query_cache_min_res_unit | 4096 |

| query_cache_size | 1048576 |

| query_cache_type | DEMAND |

| query_cache_wlock_invalidate | OFF |

+------------------------------+---------+

6 rows in set (0.44 sec)



mysql>>show global status like '%Qcache%';

+-------------------------+---------+

| Variable_name | Value |

+-------------------------+---------+

| Qcache_free_blocks | 1 |

| Qcache_free_memory | 1031832 |

| Qcache_hits | 0 |

| Qcache_inserts | 0 |

| Qcache_lowmem_prunes | 0 |

| Qcache_not_cached | 3 |

| Qcache_queries_in_cache | 0 |

| Qcache_total_blocks | 1 |

+-------------------------+---------+

8 rows in set (0.14 sec)


相关参数解释如下:


Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,说明查询缓存中的内存碎片过多。


Qcache_free_memory:表示Query Cache中目前剩余的内存大小。


Qcache_hits:表示有多少次命中缓存。


Qcache_inserts: 表示多少次未命中缓存然后插入,意思是新来的SQL请求如果在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。


Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移出查询缓存。


Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量。


Qcache_queries_in_cache:当前缓存中缓存的查询数量。


Qcache_total_blocks:当前缓存的block数量。


执行一次查询:

>select count(*) from test;

+----------+

| count(*) |

+----------+

| 36675 |

+----------+

1 row in set (0.41 sec)


然后执行show status like '%Qcache%',看看有什么变化:


mysql>show global status like '%Qcache%';

+-------------------------+---------+

| Variable_name | Value |

+-------------------------+---------+

| Qcache_free_blocks | 1 |

| Qcache_free_memory | 1031832 |

| Qcache_hits | 0 |

| Qcache_inserts | 0 |

| Qcache_lowmem_prunes | 0 |

| Qcache_not_cached | 4 |

| Qcache_queries_in_cache | 0 |

| Qcache_total_blocks | 1 |

+-------------------------+---------+

8 rows in set (0.01 sec)


Qcache_hits为0.



再次执行select count(*) from test;

mysql>select count(*) from test;

+----------+

| count(*) |

+----------+

| 36675 |

+----------+

1 row in set (0.02 sec)


mysql>show global status like '%Qcache%';

+-------------------------+---------+

| Variable_name | Value |

+-------------------------+---------+

| Qcache_free_blocks | 1 |

| Qcache_free_memory | 1031832 |

| Qcache_hits | 0 |

| Qcache_inserts | 0 |

| Qcache_lowmem_prunes | 0 |

| Qcache_not_cached | 5 |

| Qcache_queries_in_cache | 0 |

| Qcache_total_blocks | 1 |

+-------------------------+---------+

8 rows in set (0.00 sec)

Qcache_hits依旧为0,说明没有使用Query Cache.


加sql_cache执行一下语句,看看有什么变化:

mysql>select sql_cache count(*) from test;

+----------+

| count(*) |

+----------+

| 36675 |

+----------+

1 row in set, 1 warning (0.00 sec)


mysql>show global status like '%Qcache%';

+-------------------------+---------+

| Variable_name | Value |

+-------------------------+---------+

| Qcache_free_blocks | 1 |

| Qcache_free_memory | 1030296 |

| Qcache_hits | 1 |

| Qcache_inserts | 1 |

| Qcache_lowmem_prunes | 0 |

| Qcache_not_cached | 5 |

| Qcache_queries_in_cache | 1 |

| Qcache_total_blocks | 4 |

+-------------------------+---------+

8 rows in set (0.00 sec)


可以看到Qcache_hits的值变为了1,再次执行:


mysql>select sql_cache count(*) from test;

+----------+

| count(*) |

+----------+

| 36675 |

+----------+

1 row in set, 1 warning (0.00 sec)


mysql>show global status like '%Qcache%';

+-------------------------+---------+

| Variable_name | Value |

+-------------------------+---------+

| Qcache_free_blocks | 1 |

| Qcache_free_memory | 1030296 |

| Qcache_hits | 2 |

| Qcache_inserts | 1 |

| Qcache_lowmem_prunes | 0 |

| Qcache_not_cached | 5 |

| Qcache_queries_in_cache | 1 |

| Qcache_total_blocks | 4 |

+-------------------------+---------+

8 rows in set (0.01 sec)


可以看到Qcache_hits的值变为了2,每次执行都累加1,说明使用了query cache。


备注:从MySQL 8.0版本以后直接取消了查询缓存的整块功能。


缓存 查询 数据 语句 变化 参数 结果 内存 数量 再次 方式 版本 页面 剩余 处理 较大 频繁 三个 信息 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎么样开发游戏软件开发 obs如何填写服务器地址 软件开发还是数据科学家 国家金融基础数据库招标 浙江菲遇互联网科技有限公司产品 2020电大数据库 怎么改sa数据库密码是多少 软件开发文档模板大学生 无锡塑合型服务器报价 省网络安全工作座谈会 济南服务器运维管理系统价格 全国网络安全编程 原神各服务器之间可以一起玩吗 数据库查询优化论文 微言科技世界互联网大会 数据库面试题软件测试 直接调用股票数据库 数据库需求分析阶段的结果 叮咚买菜软件开发怎么样 DNS服务器实验报告心得 最强蜗牛服务器连接超时 公路局网络安全应急处置预案 天津网络安全会议9月 信长之野望武将数据库 亿联网络技术股份有限公司产品 河北网络安全知识问答 网络安全工程师考证得多少钱 连云港软件开发公司哪个好 网络安全法的相关知识 计算机rd网关服务器在哪查
0