MySQL关闭查询缓存(QC)的两种方法

MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, or DROP DATABASE等操作时,之前的缓存会无效并且删除。这样一定程度上也会影响我们数据库的性能。所以对一些频繁的变动表的情况开启缓存是不明智的。还有一种情况我们测试数据库性能的时候也要关闭缓存,避免缓存对我们测试数据的影响。下面介绍两种不使用缓存的方案:

第一种:方案

首先查看数据库的缓存是开启的

SHOW VARIABLES LIKE '%cache%'

MySQL关闭查询缓存(QC)的两种方法

查看缓存命中情况 SHOW STATUS LIKE '%qcache%'

MySQL关闭查询缓存(QC)的两种方法

然后对表查询了两次,可以看到,第二次明显的缓存了数据。然后查看命中缓存变为了1

MySQL关闭查询缓存(QC)的两种方法

下面就开始关闭缓存。关闭缓存有两种放法,一种临时的,一种永久的。

临时的直接再命令行执行

set global query_cache_size=0

set global query_cache_type=0

永久的修改配置文件my.cnf ,添加下面的配置即可。有时候临时修改不生效就得使用永久修改并重启数据库了,然后想改回来的话也得永久修改重启数据库。

query_cache_type=0

query_cache_size=0

我们用永久的修改方法

MySQL关闭查询缓存(QC)的两种方法

注意改完要重启数据库,然后再进去看看   SHOW VARIABLES LIKE '%cache%'

MySQL关闭查询缓存(QC)的两种方法

然后开始查询 很明显没有命中缓存。

MySQL关闭查询缓存(QC)的两种方法

第二种方案:

在开启缓存的情况下我们对sql语句做一些改动

Select sql_no_cache count(*) from users; 不缓存

Select sql_cache count(*) from users; 缓存(也可以不加,默认缓存已经开启了)

首先查看数据库缓存开启中

MySQL关闭查询缓存(QC)的两种方法

缓存命中为0

MySQL关闭查询缓存(QC)的两种方法

然后开始查询,查询两次后发现缓存命中率依然为0,很明显没有查询缓存。

MySQL关闭查询缓存(QC)的两种方法

然后不加sql_no_cache 查询,很明显缓存命中为1,开始查询缓存了

MySQL关闭查询缓存(QC)的两种方法

第二种方案注意:这里你可能会产生一些困惑,就是我刚刚设置了走缓存,有命中率,设置完 sql_no_cache  没有缓存怎么还有命中率,那根你说的不相符呀。这里有一个误区。

SQL_NO_CACHE的真正作用是禁止缓存查询结果,但并不意味着cache不作为结果返回给query。

目前流传的SQL_NO_CACHE不外乎两种解释:

1.对当前query不使用数据库已有缓存来查询,则当前query花费时间会多点

2.对当前query的产生的结果集不缓存至系统query cache里,则下次相同query花费时间会多点

我做了下实验,似乎两种都对。

sql_cache意思是说,查询的时候使用缓存。

对SQL_NO_CACHE的解释及测试如下:

SQL_NO_CACHE means that the query result is not cached. It does not mean that the cache is not used to answer the query.

You may use RESET QUERY CACHE to remove all queries from the cache and then your next query should be slow again. Same effect if you change the table, because this makes all cached queries invalid.

综上所述,如果你之前已经查询过,已经有缓存了,再使用SQL_NO_CACHE还是会从cache中拿到结果并返回。但是这个结果并不会存入缓存中。所以就会出现你认为的SQL_NO_CACHE不生效的情况。那么这种情况如何解决呢?只能临时或者永久的设置

set global query_cache_size=0

set global query_cache_type=0

这样缓存就会失效,然后重启数据库后再将其设置为1,再重启数据库。这样你第一次查询就不会从cache中拿到结果,同时也不会将其放入缓存中了。总之,这块有坑,感觉这样的话更麻烦,不如直接设置全局不缓存了,如果在测试环境,条件可以的话应该是可以直接设置全局即可。

 

================MyBatis的对CACHE的应用======================

MyBatis的flushCache和useCache的使用

(1)当为select语句时:

flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。

useCache默认为true,表示会将本条语句的结果进行二级缓存。

(2)当为insert、update、delete语句时:

flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。

useCache属性在该情况下没有。

当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,所以,如果有必要,那么就需要人工修改配置,修改结果类似下面:

<select id="save" parameterType="XX" flushCache="true" useCache="false">

……

</select>

update 的时候如果 flushCache="false",则当你更新后,查询的数据数据还是老的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值