mysql的查询缓存是在完整的select语句基础上判断的,并且只是在刚收到SQL语句的时候才检查,因此子查询和存储过程都没办法使用查询缓存。mysql
若是查询语句中包含任何的不肯定因素或者函数,那么就不会命中查询缓存,不肯定因素指客户端协议的版本等,而不肯定函数指now()
这种函数,它随着时间变化而变化,是不肯定的。sql
在一个事务提交以前表的相关查询是不走缓存的。缓存
打个比喻就是mysql将你的整个
sql语句原封不动地先检查是否有不肯定函数,若是有不肯定函数就不走缓存,若是没有不肯定函数,那么将sql语句作个md5计算,若是找获得计算的值就走缓存,不然就不走缓存。函数
为了用上查询缓存,优化的思路有下面这些:优化
1.将子查询或者联结拆开成单表的查询,由于整个sql语句只要有不肯定的函数就不走缓存,拆开后其中的某些查询可能就走缓存了。code
2.将不肯定函数替换成肯定的值,好比你用系统函数current_date()
生成的日期就能够用提早计算好的日期替换掉。事务