

一、前言
什么是MySQL查询缓存?
MySQL缓存规则。
MySQL缓存的优缺点。
MySQL缓存对性能的影响。
二、 什么是查询缓存

如果没有匹配,将这个hash值存放在一个hash链表中,并将Query的结果集存放到cache中。
如果通过hash值匹配到了一样的Query,则直接将cache中相应的Query结果集返回给客户端。
三、MySQL缓存管理和配置
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 | 599040 || query_cache_type | ON || query_cache_wlock_invalidate | OFF |+------------------------------+---------+6 rows in set (0.02 sec)

四、MySQL缓存规则
将查询语句和结果集返回到内存,下次再查直接从内存中取;
sessions共享,一个client查询的缓存结果,另一个client也可以使用;
SQL必须完全一致才会导致cache命中;
不确定的函数将永远不会被cache, 比如current_date, now等;
太大的result set不会被cache (< query_cache_limit);
MySQL缓存在分库分表环境下是不起作用的;
执行SQL里有触发器,自定义函数时,MySQL缓存也是不起作用的;
在表的结构或数据发生改变时,基于该表相关cache立即全部失效。
五、查询缓存的优缺点
MySQL会对每条接收到的SELECT类型的查询进行hash计算,然后查找这个查询的缓存结果是否存在。虽然hash计算和查找的效率已经足够高了,一条查询语句所带来的开销可以忽略,但一旦涉及到高并发,有成千上万条查询语句时,hash计算和查找所带来的开销就必须重视了。
Query Cache的失效问题。如果表的变更比较频繁,则会造成Query Cache的失效率非常高。表的变更不仅仅指表中的数据发生变化,还包括表结构或者索引的任何变化。
查询语句不同,但查询结果相同的查询都会被缓存,这样便会造成内存资源的过度消耗。查询语句的字符大小写、空格或者注释的不同,Query Cache都会认为是不同的查询(因为他们的hash值会不同)。
相关系统变量设置不合理会造成大量的内存碎片,这样便会导致Query Cache频繁清理内存。
对性能的影响
读查询开始之前必须检查是否命中缓存。
如果读查询可以缓存,那么执行完查询操作后,会查询结果和查询语句写入缓存。
当向某个表写入数据的时候,必须将这个表所有的缓存设置为失效,如果缓存空间很大,则消耗也会很大,可能使系统僵死一段时间,因为这个操作是靠全局锁操作来保护的。
对InnoDB表,当修改一个表时,设置了缓存失效,但是多版本特性会暂时将这修改对其他事务屏蔽,在这个事务提交之前,所有查询都无法使用缓存,直到这个事务被提交,所以长时间的事务,会大大降低查询缓存的命中。
生产如何设置MySQL Query Cache
参考
MySQL查询性能 MySQL缓存之Qcache与buffer pool对比 《高性能MySQL》之查询缓存




