千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Query Cache存储SELECT语句及其产生的数据结果,特别适用于表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生 变化的信息。如果此表上有任何写表操作发生,那么和这个表
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 互联网新科技 互联网最新的科技有限公司 猪兼强互联网科技 互联网与未来科技 华中科技大学互联网 友谊互联网络科技 互联网科技博客 科技类的互联网平台 互联网公司会议桌创意科技软装饰 创业天下互联网科技有限公司 南平创想时代互联网科技有限公司 互联网科技和法律行业 威龙国际互联网科技公司 互联网金融科技名词解释 恒生互联网科技业指数调整周期 珠海东科互联网科技有限公司 江苏互联网智能科技产品出厂价 互联网科技手抄报图片 科技信息时代互联网发展 河南商务圈互联网科技有限公司 花魁咖啡 百单网互联网科技有限公司怎么样 河南云网互联网络科技有限公司 高科技互联网 互联网最新的科技有限公司 互联网科技ppt模板 互联网科技公司介绍 哈尔滨秒房互联网科技有限公司 湖南洣水互联网科技有限公司扣款 科技与互联网的利与弊
0