连接建立完成后,第二步查询缓存。

当执行查询语句的时候,会先去查询缓存中查看结果,之前执行过的sql语句及其结果以key-value的形式存储在缓存中,如果查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端;如果找不到,就继续执行后续的阶段。

key是查询的语句,value是查询的结果。

执行完成后,执行结果会被存入查询缓存中。如果查询命中缓存,MySQL不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

但是,不推荐使用查询缓存:

  • 查询缓存的失效比较频繁,只要表更新,缓存就会清空
  • 缓存对应新更新的数据命中率比较低
    1. 可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。

MySQL提供了这种“按需使用”的方式:
你可以将参数query_cache_type设置成 DEMAND,这样对于默认的SQL语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,像下面这个语句一样:

mysql> select SQL_CACHE * from T where ID=10;

需要注意的是,MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了。