查询缓存,MySQL判断缓存是否命中的方法很简单:缓存存放在一个引用表中,通过哈希值引用,哈希值包含如下因素:查询本身,当前要查询的数据库,客户端协议版本等,MySQL不会解析,格式化或者参数化查询,而是直径使用SQL语句或客户端发送过来的原始信息,任何字符上的不同,空格,注释都会导致缓存不命中。查询缓存会对读和写操作带来消耗,读查询在开始之前会先检查是否命中缓存,如果读查询可以被缓存,那么完成之后,MySQL发现没有缓存,则会将结果放入缓存,也有系统消耗,当写入数据时,MySQL将对应表的所有缓存置为失效,这时如果缓存很大,或者碎片很多,也会有系统消耗,对查询缓存操作是排他操作,有系统消耗,查询缓存失效的操作有全局锁,导致整个系统僵死。通过设置参数query_cache_min_res_unit查询缓存大小,申请空间快比较慢,所以不易太小,容易导致多长申请,也不能过大,因为如果查询结果只需要很小一部分空间,容易导致浪费,没用完的空闲空间会产生碎片。通过设置参数query_cache_type打开查询缓存,query_cache_size设置查询缓存的总内存空间,这个值必须是1024的整数倍,设置query_cache_min_res_unit设置查询缓存内存快的最小单位,query_cache_limit设置查询缓存的最大查询结果。innodb让所有加锁操作的事务都不使用查询缓存。查询缓存优化,批量写入时只做一次查询缓存失效,相比单条插入效率高,但是不要做延迟写操作,导致性能问题。