开发者社区> 杰克.陈> 正文

MySQL 查询缓存

简介: 原文:MySQL 查询缓存 MySQL查询执行流程 查询流程: 客户端发送一条查询给服务器; 服务器先检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果;否则,进入下一阶段; 服务器进行SQL解析、预处理,再由优化器生成对应的执行计划; MySQL...
+关注继续查看
原文: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手动控制缓存;

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
高可用服务架构设计(12) - 基于request cache请求缓存技术优化批量商品数据查询接口
0 Github 回顾执行流程 1、创建command,2种command类型 2、执行command,4种执行方式 3、查找是否开启了request cache,是否有请求缓存,如果有缓存,直接取用缓存,返回结果 首先,reqeust context(请求上下文) 一般在一个web应用中,Hy...
3151 0
Mysql查询一段时间记录
Mysql查询一段时间记录 MYSql查詢一段時間記錄 24小时内记录(即86400秒) $sql="SELECT video_id,count(id)as n FROM rec_down WHERE UNIX_TIMESTAMP(NOW())-UNI...
1107 0
MySQL 查询结果保存为CSV文件
MySQL 查询结果保存为CSV文件如何解决
14 0
mysql 查询
FIND_IN_SET(str,strlist) ------->针对逗号隔开的假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。
670 0
mysql查询拼接
1 不同于sqlserver ,不能使用”+”,”+”号是使用字符转为数字处理,无法转换则忽略 select '11'+'12','abc'+1 from dual; 结果如下图: 使用concat()函数 select concat('11','12') from dual; select concat('11',12) from dual;
865 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18468 0
linq to sql中的自动缓存(对象跟踪)
这篇东西应该至少一年前就写的,不过因为个人太懒,一直没记下来,今天补上.   linq to sql中,对于同一个DataContext上下文环境,根据表主键选择记录时(当然这里所指的“记录”会自动转成“对象”),如果该记录已经被select过,默认情况下会被自动缓存下来,下次再选择时,将自动返回已缓存的对象,而不是重新从数据库里查询。
639 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24975 0
MySQL查询日志总结
MySQL查询日志介绍     MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。默认文件名为hostname.log。默认情况下MySQL查询日志是关闭的。
750 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载