原理与作用
当一个请求到达MySQL后,先到查询缓存查看是否以前执行过该语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,就会将 value被直接返回给客户端。
如果语句在查询缓存中不命中,就会继续正常的查询过程。执行完成后,将执行结果作为value,将查询语句作为key存入查询缓存。
可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。
建议
大多数情况下不要使用查询缓存,因为查询缓存往往弊大于利。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把查询结果缓存起来,还没使用呢,就被一个更新全清空了。对于更新比较频繁的数据库来说,查询缓存的命中率非常低。
需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了
使用场景
对于写少读多的场景比较适用。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
MySQL 也提供了这种“按需使用”的方式。你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样:
select SQL_CACHE * from Table1 where ID=10;