MySQL之高级特性(四)

高级特性

查询缓存

什么情况下查询缓存能发挥作用

并不是什么情况下查询缓存都会提高系统性能的。缓存和失效都会带来额外的消耗,所以只有当缓存带来的资源节约大于本身的资源消耗时才会给系统带来性能提升。这跟具体的服务器压力模型有关。理论上,可以通过观察打开或者关闭查询缓存时候的系统效率来决定是否需要开启查询缓存。关闭查询缓存时,每个查询都需要完整的执行,每一次写操作执行完成后立刻返回;打开查询缓存时,每次读请求先检查缓存是否命中,如果命中则立刻返回,否则就完整地执行查询,每次写操作则需要检查查询缓存中是否有需要失效的缓存,然后再返回。这个过程还比较简单明了,但是要评估打开查询缓存是否能够带来性能提升却并不容易。还有一些外部的因素需要考虑,例如,查询缓存可以降低查询执行的时间,但是却不能减少查询结果传输的网络消耗,如果这个消耗是系统的主要瓶颈,那么查询缓存的作用也很小。
因为MySQL再SHOW STATUS中只能提供一个全局的性能指标,所以很难根据此来判断查询缓存是否能够提升性能(Percona和MariaDB对MySQL慢日志进行了改进,会记录慢日志中的查询是否命中查询缓存)。很多时候,全局平均不能反应实际情况。例如,打开查询缓存可以使得一个很慢的查询变得非常快,但是也会让其他查询稍微慢一点点。有时候如果能够让某些关键的查询速度更快,稍微降低一下其他查询的速度是值得的。不过这种情况我们推荐使用SQL_CACHE来优化对查询缓存的使用。
对于哪些需要消耗大量资源的查询通常都是非常适合缓存的。例如一些汇总计算查询,具体的如COUNT()等。总的来说,对于复杂的SELECT语句都可以使用查询缓存,例如多表JOIN后还需要做排序和分页,这类查询每次执行消耗都很大,但是返回的结果集却很小,非常适合查询缓存。不过需要注意的是,涉及的表上UPDATE、DELETE和INSERT操作相比SELECT来说要非常少才行。
一个判断查询缓存是否有效地直接数据是命中率,就是使用查询缓存返回结果占总查询的比率。当MySQL接收到一个SELECT查询的时候,要么增加Qcache_hits的指,要么增加Com_select的值。
在这里插入图片描述
在这里插入图片描述

所以查询缓存命中率可以由如下公式计算:Qcache_hits/(Qcache_hits+Com_select)
不过,查询缓存命中率是一个很难判断的数值。命中率多大才是好的命中率?具体情况要具体分析。只要查询缓存带来的效率提升大于查询缓存带来的额外消耗,即使30%命中率对系统性能提升也有很大好处。另外,缓存了哪些查询也很重要,例如,被缓存的查询本身消耗非常巨大,那么即使缓存命中率非常低,也仍然会对系统性能提升有好处。所以,没有一个简单的规则可以判断查询缓存是否对系统有好处。
任何SELECT语句没有从查询缓存中返回都成为"缓存未命中"。缓存未命中可能有如下几种原因:

  • 1.查询语句无法被缓存,可能是因为查询种包含一个不确定的函数(如CURRENT_DATE),或者查询结果太大而无法缓存。这都会导致状态值Qcache_not_cached增加
  • 2.MySQL从未处理这个查询,所以结果也从不曾被缓存过
  • 3.还有一种情况是虽然之前缓存了查询结果,但是由于查询缓存的内存用完了,MySQL需要将某些缓存"逐出",或者由于数据表被修改导致缓存失效。

如果你的服务器上有大量缓存未命中,但是实际上绝大数查询都被缓存了,那么一定是有如下情况发生:

  • 1.查询缓存还没有完成预热。也就是说,MySQL还没有机会将查询结果都缓存起来。
  • 2.查询语句之前从未执行过,如果你的应用程序不会重复执行一条查询语句,那么即使完成预热仍然会有很多缓存未命中
  • 3.缓存失效操作太多了

缓存碎片、内存不足、数据修改都会造成缓存失效。如果配置了足够的缓存空间,而且query_cache_min_res_unit设置也合理的化,那么缓存失效应该主要是数据修改导致的。可以通过参数Com_*来查看数据修改的情况(包括Com_update,Com_delete,等等),还可以通过Qcache_lowmem_prunes来查看多少次失效是由于内存不足导致的。
在考虑缓存命中率的同时,通常还需要考虑缓存失效带来的额外消耗。一个极端的办法是,对某一个表先做一次只有查询的测试,并且所有的查询都命中缓存,而另一个相同的表只做修改操作。这是,查询缓存的命中率就是100%。但因为会给更新操作带来额外的消耗,所以查询缓存并不一定会带来总体效率的提升。这里,所有的更新语句都回做一次缓存失效检查,而检查的结果都是相同的,这会给系统带来额外的资源浪费。所以,如果你只是观察查询缓存的命中率的话,可能完全不会发现这样的问题。
在MySQL张入股更新操作和带缓存的读操作混合,那么查询缓存带来的好处通常很难很亮。更新操作会不断地使得缓存失效,而同时每次查询还会像缓存中再写入新的数据。所以甚至有当后续的查询能够在缓存失效前使用缓存才会有效地利用查询缓存。

如果缓存的结果在失效前没有被任何其他的SELECT语句使用,那么这次缓存操作就是浪费时间和内存。我们可以通过查看Com_select和Qcache_inserts的相对值来看看是否一直有这种情况发生。如果每次查询查询都是缓存未命中,然后需要将查询结果放到缓存中,那么Qcache_inserts的大小应该和Com_select相当。所以在缓存完成预热后,我们总希望看到Qcache_inserts远远小于Com_select。不过由于缓存和服务器内部的复杂和多样性,仍然很难说,这个比率是多少才是一个合适的值。
所以,上面的"命中率"和"INSERTS和SELECT比率"都无法直观地反应查询缓存的效率,那么还有什么直观的办法能够反应查询缓存是否对系统有好处?这里推荐查看一个指标"命中和写入"的比率。即Qcache_hits和Qcache_inserts的壁纸。根据经验来看,当这个比值大于3:1时通常查询缓存是有效的,不过这个比率最好能够达到10:1.如果你的应用没有达到这个比率,那么就可以考虑禁用查询缓存了。除非你能够通过精确的计算得知:命中带来的性能提升大于缓存失效的消耗,并且查询缓存并没有成为系统的瓶颈。
每一个应用程序都会有一个"最大缓存空间",甚至对一些纯读的应用来说也一样。最大缓存空间是能够缓存所有可能查询结果的缓存空间综合。理论上,对多数应用来说,这个数值都会非常大。而实际上,由于缓存失效的原因,大多数应用最后使用的缓存空间都比预想的要小。即使你配置了足够大的缓存空间,由于不断地失效,导致缓存空间一直都不会接近"最大缓存空间"。
通常可以观察查询缓存内存的实际使用情况,来确定是否需要缩小或者扩大查询缓存。如果查询缓存空间长事件都有剩余,那么建议索引;如果经常由于空间不足而导致查询缓存失效,那么则需要增大查询缓存。不过需要注意,如果查询缓存达到了几十兆这样的数量级,是有潜在危险的。
另外,可能还需要和系统的其他缓存一起考虑,例如InnoDB的缓存池,或者MyISAM的索引缓存。关于这点是没法简单给出一个公式或者比率来判断的,因为真正的平衡点与应用程序有很大的关系。
最好的判断查询缓存是否有效的办法还是通过查询某类查询时间消耗是否增大或者减少来判断。Percona Server通过扩展慢查询可以观察到一个查询是否命中缓存,如果查询缓存没有为系统节省时间,那么最好禁用它

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode中模糊搜索和替换

文章目录 调出搜索(快捷键)使用正则(快捷键)替换(快捷键)案例假设给定文本如下目标1:查找所有函数名目标2:替换所有函数名为hello目标3:给url增加查询字符串参数 调出搜索…

【Android】实现Recyclerview的Item可以左右侧滑动的效果

项目需要 使用Recyclerview进行列表的数据加载的时候,需要对这个Item进行左右滑动进行操作的功能, 比如这样 需求实现 上面图来源于 https://github.com/anzaizai/EasySwipeMenuLayout 这是一个可以用来进行列表左滑、右滑的项目,可以集…

获取域名证书过期时间脚本——筑梦之路

实现原理 通过获取域名的whois信息过滤从中找出域名到期时间即可。 脚本内容 #!/bin/bash #####################################检测是否存在whois命令,不存在则安装jwhois包 which whois &>/dev/null || yum install -y jwhois# 设置要检查的域名 DOMAI…

【kaggle量化交易第一名方案】Trading at the Close

2024 1st Place Solution Overview 最终模型(CV/Private LB为5.8117/5.4030)是CatBoost(5.8240/5.4165)、GRU(5.8481/5.4259)和Transformer(5.8619/5.4296)的组合,权重分别为0.5、0.3、0.2,从验证集中搜索得到。这些模型共享相同的300个特征。 此外,在线学习(On…

力扣275.H指数 II

力扣275.H指数 II 二分答案 class Solution {public:int hIndex(vector<int>& citations) {int n citations.size();auto check [&](int mid) -> bool{int res0;for(int i0;i<n;i){if(citations[i] > mid) res;if(res > mid) return true;}retu…

积木搭建游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第83讲。 积木搭建游戏&…

flink学习-状态管理

状态管理 在flink中&#xff0c;算子可以分为无状态和有状态两种情况。 无状态的算子只需要观察每个独立事件&#xff0c;根据当前输入的数据直接输出结果。像&#xff1a;filter、flatMap、map都属于无状态的算子。 有状态的算子则是除当前数据之外&#xff0c;还需要一些其他…

openstack删除实例卡死在正在删除中

删除实例 问题描述解决办法 实验环境&#xff1b;服务器&#xff0c;openstackY版 问题描述 openstack在删除实例时一直显示正在删除中 解决办法 进入数据库修改实例状态&#xff0c;修改为错误&#xff0c;然后重新删除 首先查看对应实例id 进入数据库修改 rootcompute:~…

盘点:支持国产化信创的项目管理软件有哪些?

对于个人或者预算充足的团队来说&#xff0c;找到一个靠谱、好用的项目管理软件是一件很有必要的事情&#xff0c;那么目前国内有哪些【国产化信创】的项目管理软件值得选择呢&#xff1f; 下面盘点10款&#xff0c;每一款都独具特色。 1、国产化项目管理软件&#xff0c;可灵活…

工具:安装R语言的R包的各种方法

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 R语言提供的大量R包为众多研究者提供了足够的工具&#xff0c;但是如何安装R包是很多人在使…

医疗图像自动轮廓勾画

医疗图像自动轮廓勾画(也称为自动分割)是一个重要的任务,旨在从医学影像数据中自动提取出感兴趣的解剖结构或病变区域。这项技术在医学诊断、治疗规划和随访中起着至关重要的作用。 文末附基于Keras和TensorFlow的示例代码,用于使用U-Net进行医疗图像自动轮廓勾画代码。 …

Ubuntu server 24 (Linux) 新增磁盘 lvm 动态扩容磁盘空间

1 新增一块硬盘 #查看 sudo fdisk -l #重新分区&#xff0c;转换成lvm类型 sudo fdisk /dev/sdb 2 查看磁盘 df -h3 lvm 配置 #查看lvm逻辑卷 sudo lvdisplay #创建物理卷 sudo pvcreate /dev/sdb1 #扩展卷组 sudo vgextend ubuntu-vg /dev/sdb1 #扩展逻辑卷 sudo lvexte…

linux网络编程poll笔记

poll函数执行的时候具体做了啥&#xff1f; 代码示例&#xff1a; // ....... struct pollfd fds[1024] {0}; fds[sockfd].fd sockfd; fds[sockfd].events POLLIN;int maxfd sockfd; while(1) {int nready poll(fds, maxfd1, -1);// ...... } //....... 1. poll中会…

vue2中使用el-table实现直接编辑表格,鼠标点击空白处实现保存并传递给后端的简单方法

<el-table-column prop"remark" width"120px" label"备注" align"center"><template slot-scope"scope"><span v-if"!scope.row.setingFlag" click"handleEdit(scope.row)">{{scope.…

超声波眼镜清洗机有用吗?四大王牌巅峰超声波清洗机推荐!

在市场上&#xff0c;有很多种家用眼镜超声波清洗机可供选择。但是并不是所有超声波眼镜清洗机清洗的效果都是好的&#xff0c;很多不了解超声波清洗机的朋友容易盲目跟风或者在商家无脑吹的大功率清洗的情况下选择哪些所谓好用的产品&#xff0c;最后却导致踩雷&#xff01;所…

孩子小学毕业了

难说再见 时间已到眼前 一张张照片 模糊了我双眼

怎么脚本ai创作?分享三个方法

怎么脚本ai创作&#xff1f;在数字化时代&#xff0c;AI技术正逐渐渗透到我们生活的方方面面&#xff0c;其中AI脚本创作软件的出现&#xff0c;极大地提高了创作效率&#xff0c;降低了创作门槛。今天&#xff0c;就为大家推荐三款备受好评的AI脚本创作软件&#xff0c;其中聪…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第40课-实时订阅后端数据

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第40课-实时订阅后端数据 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引…

Elastic 索引结构-倒排索引

前言 Elastic 在数据库分类中一般被分为全文检索的数据库&#xff0c;那为什么这么区分呢&#xff1f;主要是因为其独特的索引结构 即倒排索引。 倒排索引 倒排索引先将文档中包含的关键字全部提取出来&#xff0c;然后再将关键字与文档的对应关系保存起来&#xff0c;最后再…

技术应用:使用Spring Boot和Vue.js构建前后端分离的JWT认证应用

导语&#xff1a; 在当前的软件开发领域&#xff0c;前后端分离的架构已经成为了主流。结合Spring Boot和Vue.js这两个流行的框架&#xff0c;我们可以轻松地构建出强大而现代的Web应用。本文将深入探讨如何使用Spring Boot和Vue.js构建一个前后端分离的JWT认证应用&#xff0c…