MYSQL性能调优04_连接器、查询缓存、分析器、优化器、执行器、一图详解MYSQL底层工作原理(二)

③. 查询缓存


①. 连接建立完成后,你就可以执行select语句了。执行逻辑会进行查询缓存


②. MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端


③. 如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查 询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。



④. 大多数情况查询缓存就是个鸡肋,为什么呢?


(因为查询缓存往往弊大于利。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。 因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率 会非常低)


⑤. 一般建议大家在静态表里使用查询缓存,什么叫静态表呢?就是一般我们极少更新的表。比如,一个系统配置表、字典 表,那这张表上的查询才适合使用查询缓存。好在 MySQL 也提供了这种“按需使用”的方式。你可以将my.cnf参数 query_cache_type设置成DEMAND


my.cnf
#query_cache_type有3个值 0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE 关键词时才缓存
query_cache_type=2


⑥. 这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样


mysql> select SQL_CACHE * from test where ID=5;
# 查看当前mysql实例是否开启缓存机制
mysql> show global variables like "%query_cache_type%";


⑦. 监控查询缓存的命中率:


Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片 过多了,可能在一定的时间进行整理


Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多 了,还是不够用,DBA可以根据实际情况做出调整


Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想


Qcache_inserts:表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行 查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理 想。当然系统刚启动后,查询缓存是空的,这很正常


Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的 调整缓存大小


Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量


Qcache_queries_in_cache:当前缓存中缓存的查询数量。


Qcache_total_blocks:当前缓存的block数量


mysql> show status like'%Qcache%'; //查看运行的缓存信息


MYSQL性能调优04_连接器、查询缓存、分析器、优化器、执行器、一图详解MYSQL底层工作原理(二)

⑧. mysql8.0已经移除了查询缓存功能


上一篇:使用过滤统计信息解决基数预估错误


下一篇:MySQL优化案例:半连接(semi join)优化方式导致的查询性能低下