zoukankan      html  css  js  c++  java
  • MySQL 查询缓存

    MySQL查询执行流程

    wKioL1NWdF-g-z3mAATdFkLRKYs670.jpg

    查询流程

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

    2. 服务器先检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果;否则,进入下一阶段;

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

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

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

     

     

    查询缓存

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

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

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

     

    何种语句不会被缓存

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

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

     

    缓存会带来额外开销,因为:

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

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

    • 对写操作也有影响,因为当写入数据时,MySQL必须将对应表的所有缓存都设置失效,这在缓存内存较大时将导致很大的系统消耗;

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

     

    缓存相关变量查询

    wKioL1NWdJHxnapRAAhZy1ojoo0875.jpg

     

    如何判断缓存命中率

    缓存命中率相关的变量

    wKiom1NWdOSDdJESAASKt6x2euE164.jpg

    计算缓存命中率

    wKiom1NWdQCRW5roAANvlDJ4hnM274.jpg

     

    缓存优化的思路

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

    • 缓存空间不宜过大,因为大量缓存同时失效会导致服务器假死;

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

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

  • 相关阅读:
    java 构造函数内部的多态方法 完全剖析
    Android 高仿微信 获取最近刚刚拍照的缩略图 功能实现
    Android 高仿豌豆荚 一键安装app 功能 实现
    Android Bitmap实战技巧
    Android 异步加载神器Loader全解析
    Android 开源项目PhotoView源码分析
    细数Android开源项目中那些频繁使用的并发库中的类
    js 压缩图片 H5
    上传从剪贴板复制的图片
    moble 设备多指手势识别 (tap , double_tap , pinch)
  • 原文地址:https://www.cnblogs.com/xiaocen/p/3720337.html
Copyright © 2011-2022 走看看