MySQL 查询缓存

MySQL查询执行流程mysql

wKioL1NWdF-g-z3mAATdFkLRKYs670.jpg

查询流程sql

  1. 客户端发送一条查询给服务器;缓存

  2. 服务器先检查查询缓存,若是命中了缓存,则当即返回存储在缓存中的结果;不然,进入下一阶段;服务器

  3. 服务器进行SQL解析、预处理,再由优化器生成对应的执行计划;函数

  4. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;性能

  5. 将结果返回给客户端;优化

 

 

查询缓存spa

  • 用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会当即返回结果,省去解析、优化和执行等阶段;blog

  • MySQL保存结果于缓存中,把select语句自己作hash计算,计算的结果做为key,查询结果做为value;内存

  • 查询语句的大小写会影响缓存的存储和命中,故需保持查询语句的大小写一致性;

 

何种语句不会被缓存

  • 查询语句中有一些不肯定数据时,不会缓存,如now(),current_time()等

  • 若查询中包含用户自定义函数,存储函数,用户变量,临时表,mysql库中系统表,或者任何包含权限的表,通常都不会缓存

 

缓存会带来额外开销,由于:

  • 读查询在开始以前必须先检查是否命中缓存;

  • 若某个读查询能够被缓存且未被缓存,那么当完成执行后,MySQL会将其结果存入查询缓存;

  • 对写操做也有影响,由于当写入数据时,MySQL必须将对应表的全部缓存都设置失效,这在缓存内存较大时将致使很大的系统消耗;

  • 故查询缓存并不是必需,其效率取决于所有查询中开销较大的查询是否能被缓存命中;

 

缓存相关变量查询

wKioL1NWdJHxnapRAAhZy1ojoo0875.jpg

 

如何判断缓存命中率

缓存命中率相关的变量

wKiom1NWdOSDdJESAASKt6x2euE164.jpg

计算缓存命中率

wKiom1NWdQCRW5roAANvlDJ4hnM274.jpg

 

缓存优化的思路

  • 批量写入而非屡次单个写入;

  • 缓存空间不宜过大,由于大量缓存同时失效会致使服务器假死;

  • 必要时,使用sql_cache和sql_no_cache手动控制缓存;

  • 对写密集型的应用场景来讲,禁用缓存反而能提升性能

相关文章
相关标签/搜索