很多数据库产品能够缓存查询的执行计划,就是说,下一次同类型的sql,可以不通过sql解析和执行计划生产的过程。mysql还有另一种缓存机制,就是缓存完整的select查询结果。就是下一次查询命中缓存的话,会直接返回结果,跳过解析、优化和执行过程。

查询缓存会跟踪查询中涉及的每张表,当表结构发生变化时,所有和这个表相关的查询缓存就会全部失效。

查询缓存对应用程序来说是透明的,即应用程序不知道结果是来自于查询缓存还是实际执行的结果。

查询缓存可以影响到服务器扩展性,它能成为服务器的资源竞争点,多核服务器可能会导致服务器僵死。多数时候是默认关闭查询缓存的,但是如果查询缓存作用很大的话,是可以通过配置,分配固定的空间来使用查询缓存的。

查询缓存的命中原理:

判断命中的方法很简单,mysql会将缓存存放在一张引用表中,通过哈希值引用,这个哈希值是根据查询本身,数据库,客户端协议等元素生成的。一旦命中就会直接返回结果,不会再通过mysql正常的查询流程执行,这个哈希值受空格,注释等影响,任何的不同都会导致无法命中查询缓存,所以,统一的编码规则是很重要的。

还有就是,mysql不会缓存包含用户自定义函数的结果的查询。比如NOW(),CURRENT_DATE()。还有类似当前用户(current_user)connection_id这类查询也不会返回缓存。

总结下来就是,mysql不会缓存包含有用户自定义函数,临时表,用户变量,存储函数,系统表以及任何用户权限相关的数据。