清除/关闭 查询缓存
最后更新于:2022-04-02 03:56:00
[TOC]
## 概述
QC 要求前后两次请求的 SQL 完全一样,不同数据库、不同协议版本或不同默认字符集的查询,都会被认为是不同的查询。甚至包括大小写,
比如下面两条 SQL ,查询缓存就会认为是两个不同的查询:
```
SELECT * FROM tbl_name
Select * from tbl_name
```
**是否开启缓存**
1. 如果线上环境中 99% 以上都是只读,很少更新,可以考虑全局开启 QC,也就是设置 query_cache_type 为 1
2. 只缓存的是几张更新频率很低的表,其它表不考虑使用查询缓存,就可以考虑将 query_cache_type 设置成 2,这样就只缓存下面这类 SQL:
```
select sql_cache from hs_user;
```
缺点:
1. 每次查询不一样,会额外增加开销
2. 需要前后两条 SQL 完全一样才能使用
3. 只要存在更新,就会清空这张表的查询缓存
## 实例
### 开启缓存
全局开启 QC
```
// my.cnf
query_cache_type = 1
query_cache_size = 50M
```
只开启部分表的 QC:
```
// my.cnf
query_cache_type = 2
query_cache_size = 50M
```
如果要开启 QC,建议不要设置过大,通常几十兆就好。如果设置过大,会增加维护缓存所需要的开销。
### 是否开启缓存
```
show variables like “%query_cache%”;
```
query_cache_type:缓存类型,有三个值可选:
```
0 或者 off:关闭缓存
1 或者 on:打开缓存
2 或者 demand:只缓存带有 sql\_cache 的 select 语句。
```
### 监视查询缓存的使用情况
![](https://img-blog.csdnimg.cn/20191028163208802.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDI4MDA4,size_16,color_FFFFFF,t_70)
```
Qcache_free_blocks:查询缓存中的空闲内存块的数目
Qcache_free_memory:查询缓存的空闲内存总数
Qcache_hits:缓存命中次数
Qcache_inserts:被加入到缓存中的查询数目
Qcache_lowmem_prunes:因为缺少内存而从缓存中删除的查询数目
Qcache_not_cached:没有被缓存的查询数目
Qcache_queries_in_cache:在缓存中已注册的查询数目
Qcache_total_blocks:查询缓存中的块的总数目
```
### 清除查询缓存
```
FLUSH QUERY CACHE; //清理查询缓存内存碎片
RESET QUERY CACHE; //从查询缓存中移出所有查询
FLUSH TABLES; //关闭所有打开的表,同时该操作将会清空查询缓存中的内容
```
### 关闭查询缓存
`SELECT SQL_NO_CACHE * form table_name`
';