MySQL查询缓存

本文详细介绍了MySQL查询缓存的工作原理及其配置参数。查询缓存能够显著提高查询速度,但其简单实现方式可能会导致不必要的缓存失效。文章还讨论了如何通过特定关键字控制查询是否被缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL 查询缓存保存查询返回的完整结果。当查询命中改缓存,MySQL 会立刻返回结果,跳过了解析、优化和执行阶段。
查询缓存系统会跟踪查询涉及查询中的每个表,如果这些表发生变化,那么和这个表相关的所有查询数据都将失效。这种机制看起来很低效,因为数据变化时很可能对应查询结果并没有变更,但是这种简单实现方式代价很小,对于一个非常繁忙的系统来说至关重要。

MySQL 判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包含了如下因素,即查询本身、当前要查询的数据库、客户端协议的版本等。当判断缓存是否命中时,MySQL 不会解析、“正规化”或者参数化查询语句,而是直接使用 SQL 语句和客户端送过来的其他原始信息。任何字符上的不同,如空格。注释等都会导致缓存不命中。
如果查询中包含任何用户自定义的函数、存储函数、用户变量、临时表、mysql 库中的系统表等都不会被缓存。

查询缓存配置:
query_cache_type
是否打开查询缓存。可以设置成 OFF、ON 或 DEMAND。DEMAND表示只有在查询语句中使用 SQL_CACHE 的语句才放入查询缓存。默认为 ON,分别对应数字 0,1,2。

query_cache_size
查询缓存使用的总内存的空间,单位是字节。这个值必须是1024的倍数,否则 MySQL 实际分配的数据会有所不同。默认16M。

query_cache_min_res_unit
查询缓存中分配内存块时的最小单位。设置小,浪费空间少,但是频繁的内存申请;如果设置大,碎片会很多。

query_cache_limit
MySQL 查询缓存的最大查询结果。默认1M。

query_cache_wlock_invalidate
如果某个数据表被其他的连接锁住,是否仍然从查询缓存中返回结果。默认是 OFF。

手动设置查询缓存:
SQL_CACHE 和 SQL_NO_CACHE
OFF/0,不缓存所有查询结果。
ON/1,缓存所有查询结果,SELECT SQL_NO_CACHE .... 指定不缓存。
DEMAND/2,显示指定缓存结果,SELECT SQL_CACHE .... 指定缓存。

转载于:https://my.oschina.net/u/2950586/blog/1329946

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值