查询缓存-将查询的结果通过缓存下载,如果查询语句完全相同,就直接返回缓存的结果。

在某个场景下,需要经常执行大量相同的查询语句,而且查询的结果也不会经常被更新,这时使用查询缓存就可以做到性能上的提升。

检查服务是否开启了查询缓存功能

query_cache_type的值为on说明开启了查询缓存功能,还有off和demand 分别表示关闭和按需缓存。
have_query_cache的值为yes说明当前数据库支持查询缓存功能。
query_cache_limit表示单条缓存的最大值。默认为1M
query_cache_min_res_unit表示缓存值在内存中占用的最小单元,默认为4k,也就是说当前缓存值不到4k大小,在内存中也会占用4k大小的内存。
query_cache_size表示查询缓存的总大小,其值表示查询缓存在内存中空间占用的总大小。如果值为0,就不能使用查询缓存,即使开启了查询缓存功能。
query_cache_wlock_invalidate表示查询语句所查询的表,如果被锁锁定了,还用不用查询缓存返回数据。完整的意思是查询缓存遇到锁时是否会失效。off表示不失效,on表示失效。如果设置为off,系统的性能、并发能力更好;而设置为on时,更加安全,也保证了数据的一致性。

查询请求处理

只有查询语句完全相同时,缓存才可以本名中,这里的完全相同也包括语句的大小写也要相同。比如:

select * from fisha_tb1;
SELECT * FROM FISHA_TB1;

在mysql接收到查询请求时,会对查询语句进行hash计算,通过计算出的hash值来查找是否存在对应的缓存。如果当前的hash码没有命中对应的缓存,mysql就会将hash值存放在对应的hash表上,将查询结果存在对应的缓存上,以便下一次查询请求时使用。
但是,如果缓存对应的表数据发生变化时,所有与这个表相关的缓存也当然会失效,缓存对应的存储空间也会被释放。

查询缓存的使用

如果某张使用了查询缓存的表中数据频繁发生变动的话,那么查询结果的缓存失效的频率肯定是非常高的,而一个查询缓存需要做的hash计算等也是非常耗费资源的。
所以还是开头讲的,我们只在那些数据变化不频繁,而且需要重复执行相同语句的场景中使用查询缓存。

在检查查询缓存是否开启的时候讲到,query_cache_type有三个参数,on/off/demand

  • on
    这个意思是一直开启查询缓存,指定一些查询语句不使用缓存(有点类似手机的黑名单,范围现对广)

  • demand
    按需使用缓存的意思,指定对应的查询语句使用缓存(类似白名单)
    那按需使用缓存相对而言是比较灵活的。

说了大概的原理,那么如何在mysql中设置为按需缓存呢??
需要在mysql的配置文件中设置 my.cnf

//在 my.cnf中找到对应的变量修改
//在Linux下如果开放该文件的权限给所有人,提示World-writable config file '/etc/mysql/my.cnf' is ignored
//会无法生效配置
query_cache_type=DEMAND 
query_cache_size=100M

最大缓存空间是100M,而单条查询缓存最大空间为1M,也就是说当前的设置最少很够缓存100条查询结果。

查询缓存的优化信息