MySQL之高级特性(五)

news2024/7/6 18:48:06

高级特性

查询缓存

如何配置和维护查询缓存

一旦理解查询缓存工作的原理,配置起来就很容了。它也只有少数的参数可供配置。如下所示:

  • 1.query_cache_type
    是否打开查询缓存。可以设置成OFF、ON或DEMAND。DEMAND表示只有在查询语句中明确写明SQL_CACHE的语句才放入查询缓存。这个变量可以是会话级别的也可以是全局级别的
  • 2.query_cache_size
    查询缓存使用的总内存空间,单位是字节。这个值必须是1024的整数倍,否则MySQL实际分配的数据会和你指定的略有不同
  • 3.query_cache_min_res_unit
    在查询缓存中分配内存块时的最小单位。
  • 4.query_cache_limit
    MySQL能够缓存的最大查询结果。如果查询结果大于这个值,则不会被缓存。因为查询缓存在数据生成的时候就开始尝试缓存数据,所以只有当结果全部返回后,MySQL才直到查询结果是否超出限制。如果超出,MySQL则增加状态值Qcache_not_cached,并将结果从查询缓存张删除。如果你事先直到有很多这样的情况发生,那么建议在查询语句中加入SQL_NO_CACHE来避免查询缓存带来的额外消耗
  • 5.query_cache_wlock_invalidate
    如果某个数据表被其他的连接锁住,是否仍然从查询缓存中返回结果。这个参数默认是OFF,这可能在一定程序上会改变服务器的行为,因为这使得数据库可能返回其他线程锁住的数据,将参数设置成ON,则不会从缓存中读取这类数据,但是这可能会增加锁等待。对于绝大数应用来说无须注意这个细节,所以默认设置通常是没有问题的。

配置查询缓存通常很简单,但是如果想直到修改这些参数会带来哪些改变,则是一项很复杂的工作。

减少碎片

没什么办法能够完全避免碎片,但是选择合适的query_cache_min_res_unit可以帮你减少由碎片导致的内存空间浪费。设置合适的值可以平衡每个数据块的大小和每次存储结果时内存块申请的次数。这个值太小,则浪费的空间更少,但是会导致更频繁的内存块申请操作;如果这个值设置得太大,那么碎片会很多。调整合适得值其实是在平衡内存浪费和CPU消耗。这个参数的最合适的大小和应用程序的查询结果的平均大小直接相关。可以通过内存实际消耗(query_cache_szie_Qcache_free_memory)除以Qcache_queries_in_cache计算单个查询的平均缓存大小。如果你的应用程序的查询结果很不均匀,有的结果很大,有的结果很小,那么碎片和反复的的内存块分配可能无法避免。如果你发现缓存一个非常大的结果并没有什么意义(通常确实是这样),那么你可以通过参数query_cache_limit限制可以缓存的最大查询结果,借此大大减少大的查询结果的缓存,最终减少内存碎片的发生。还可以通过参数Qcache_free_blocks来观察碎片。参数Qcache_free_blocks反应了查询缓存中空闲块的多少,在这里插入图片描述
在图中的配置我们看到,有两个空闲块。最糟糕的情况是,任何两个存储结果的数据块之间都有一个非常小的空闲块。所以如果Qcache_free_blocks大小恰好达到Qcache_total_blocks/2,那么查询缓存就有严重的碎片问题。而如果你还有很多空闲块,而状态值Qcache_lowmem_prunes还不断地增加,则说ing由于碎片导致了过早地在删除查询缓存结果。可以使用命令FLUSH QUERY CACHE完成碎片整理。这个命令会将所有的查询缓存重新排序,并将所有的空闲空间都聚集到查询缓存的一块区域上。不过需要注意,这个命令并不会将查询缓存清空,清空缓存由命令RESET QUERY CACHE完成。FLUSH QUERY CACHE会访问所有的查询缓存,在这期间任何其他的连接都无法访问查询缓存,从而会导致服务器僵死一段时间,使用这个命令的时候需要特别小心这点。另外,根据经验,建议保持查询缓存空间足够小,以便在维护时可以将服务器僵死控制在非常短的时间内。

提高查询缓存的使用率

如果查询缓存不再有碎片问题,但你仍然发现命中率很低,还可能是查询缓存的内存空间太小导致的。如果MySQL无法为一个新的查询缓存结果的时候,则会选择删除某个老的缓存结果。当由于这个原因导致删除老的结果时,会增加状态值Qcache_lowmem_prunes.如果这个值增加得很快,那么可能是由下面两个原因导致的:

  • 1.如果还有很多空闲块,那么碎片可能是罪魁祸首
  • 2.如果这是没有什么空闲块了,就说明在这个系统压力下,你分配的查询缓存空间不够大。你可以通过检查状态值Qcache_free_memory来查看还有多少没有使用的内存。

如果空闲块很多,碎片很少,也没什么由于内存导致的缓存失效,但是命中率仍然很低,那么很可能说ing,在你的系统压力下,查询缓存并没有什么好处。一定是什么原因导致查询缓存无法为系统服务,例如有大量的更新或者查询语句本身都不能被缓存。如果在观察命中率时,仍然无法确定查询缓存是否给系统带来了好处,那么可以通过禁用它,然后观察系统的性能,再重新打开它,观察性能变化,据此来判断查询缓存是否给系统带来了好处。可以通过将query_cache_size设置成0,来关闭查询缓存。(改变query_cache_type的全局值并不会影响已经打开的连接,也不会将查询缓存的内存释放给系统)你还可以系统测试来验证,不过一般都很难精确地模拟实际情况。如图展示了一个用来分析配置查询缓存的流程图在这里插入图片描述

InnoDB和查询缓存

因为InnoDB有自己的MVCC机制,所以相比其他存储引擎,InnoDB和查询缓存的交互要更加复杂。MySQL4.0版本中,在事务处理中查询缓存是被禁用的,从4.1和更新的InnoDB版本开始,InnoDB会控制在一个事务中是否可以使用查询缓存,InnoDB会同时控制对查询缓存的读(从缓存中获取查询结果)和写操作(向查询缓存写入结果)。事务是否可以访问查询缓存取决于当前事务ID,以及对应的数据表上是否有锁。每一个InnoDB表的内存数据字典都保存了一个事务ID号,如果当前事务ID小于该事务ID,则无法访问查询缓存。如果表上有任何的锁,那么对这个表的任何查询语句都是无法被缓存的。例如,某个事务执行了SELECT FOR UPDATE语句,那么在这个锁释放之前,任何其他的事务都无法从查询缓存中读取与这个表相关的缓存结果。当事务提交时,InnoDB持有锁,并使用当前的一个系统事务ID更新当前表的计数器。锁一定程度上说明事务需要对表进行修改操作,当然有可能事务获得锁,却不进行任何更新操作,但是如果想要更新任何表的内容,获得相应锁则是前提条件。InnoDB将每个表的计数器设置成某个事务ID,而这个事务ID就代表了当前存在的且修改了该表的最大的事务ID.那么下面的一些事实也就成立:

  • 1.所有大于该表计数器的事务才可以使用查询缓存。例如当前系统系统的事务ID是5,且事务获取了该表的某些记录的锁,然后进行事务提交操作,那么事务1至4,都不应该再读取或者向查询缓存写入任何相关的数据
  • 2.该表的计数器并不是直接更新为对该表进行加锁的事务ID,而是被更新成一个系统事务ID,而是被更新成一个系统事务ID.搜易,会发现该事务自身后续的更新操作也无法读取和修改查询缓存。

查询缓存存储、检索和失效操作都是在MySQL层面完成,InnoDB无法绕过或者延迟这个行为。但InnoDB可以在事务中显式地告诉MySQL何时应该让讴歌表地查询缓存都失效。在有外键限制地时候这是必须地,例如某个SQL语句有ON DELEETE CASCADE那么相关关联表地查询缓存也是要一起失效的。
原则上,在InnoDB的MVCC架构下,当某些修改不影响其他事务读取一致的数据时,是可以使用查询缓存的。但是这样实现起来会非常复杂,InnoDB做了一个简化,让所有有加锁操作的事务都不适用任何查询缓存,这个限制其实并不是必须的。

通用查询缓存优化

库表结构的涉及、查询语句、应用程序涉及都可能会影响到查询缓存的效率。除了前面的介绍之外,还有一些要点需要注意:

  • 1.用多个淆表代替一个大表对查询缓存有好处。这个涉及将会使得失效策略能够在一个更合适的粒度上进行。当然,不要让这个原则过分影响你的涉及,毕竟其他的一些有时可能很容易就弥补了这个问题
  • 2.批量写入时只需要做一次缓存失效,所以相比单条写入效率更好(另外需要注意,不要同时做延迟写和批量写,否则可能会因为失效导致服务器僵死较长时间)
  • 3.因为缓存空间太大,在过期操作的时候可能会导致服务器僵死。一个简单的解决办法就是控制缓存空间的大小(query_cache_size)或者直接禁用查询缓存
  • 4.无法在数据库或者表级别控制查询缓存,但是可以通过SQL_CACHE和SQL_NO_CACHE来控制某个SELECT语句是否需要进行缓存。你还可以通过修改会话级别的变量query_cache_type来控制查询缓存
  • 5.对于写密集型的应用来说,直接禁用查询缓存可能会提高系统的性能。关闭查询缓存可以移除所有相关的消耗。例如将query_cache_size设置成0,那么至少这部分就不再消耗任何内存了
  • 6.因为对互斥信号量的竞争,有时直接关闭查询缓存对读密集型的应用也会有好处。如果你希望提高系统的并发,那么最好做一个相关的测试,对比打开和关闭查询缓存时候的性能差异。

如果不像所有的查询都进入查询缓存,但是有希望某些查询走查询缓存,那么可以将query_cache_type设置成DEMAND,然后在希望缓存的查询中加上SQL_CACHE,这虽然需要在查询中加入一些额外的语法,但是可以让你非常自由地控制哪些查询需要被缓存。相反,如果希望缓存多数查询,而少数查询又不希望缓存,那么你可以使用关键字SQL_NO_CACHE

查询缓存的替代方案

MySQL查询缓存工作的原则是:执行查询最快的方式就是不执行,但是查询仍然需要发送到服务器,服务器也还需要做一点点工作。如果对于某些查询完全不需要与服务器通信效果会如何呢?这是客户端的缓存可以很大程度上帮你分担MySQL服务器的压力。

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

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

相关文章

Excel 常用技巧(五)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件,可以用来制作电子表格、完成许多复杂的数据运算,进行数据的分析和预测,并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

解锁呼叫中心运营的无限潜能 - 信必优数字化解决方案

在当今瞬息万变的商业环境中,呼叫中心已不仅仅是一个简单的客户服务渠道。它是企业与客户建立联系、提供卓越体验的关键纽带。然而,传统的呼叫中心运营模式已无法满足日益增长的客户期望和业务需求。这就需要一种全新的解决方案来推动呼叫中心的数字化转型,释放其无限潜能。 信…

QListWidget 插入 item,item显示自定义界面

代码示意: class ItemWidget_action_cfg_w(QWidget):... # 如下方法是在指定item下插入新的item def __do_add_item(self, item):# 获取当前item rowrow self.__list_w.indexFromItem(item).row()# 注意这里没有父类,解释见后面说明new_item QList…

C++类对象模型、类对象的存储方式、this指针、this指针的引出、this指针的特性、C语言和C++实现Stack的对比等的介绍。

文章目录 前言一、C类对象模型1. 类对象的存储方式2. 结构体内存对齐规则 二、this指针1. this指针的引出2. this指针的特性3. C语言和C实现Stack的对比 总结 前言 C类对象模型、类对象的存储方式、this指针、this指针的引出、this指针的特性、C语言和C实现Stack的对比等的介绍…

如何在招聘中开始使用AI?

在人工智能时代,招聘团队面临着“用更少的钱做更多的事情”的压力:用更少的钱和更少的团队。根据一项调查,58%的受访者认为,“提高我们助教团队的效率,降低成本”是明年招聘职位的首要任务。在招聘中使用人工智能是提高…

Excel 如何复制单元格而不换行

1. 打开excle, sheet1右键单击>查看代码>插入>模块 输入代码 Sub CopyText() Updated by NirmalDim xAutoWrapper As ObjectSet xAutoWrapper New DataObject or GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")xAutoWrapper.SetText ActiveC…

东理咨询交流论坛系统

开头语:你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术、B/S架构 工具:MyEclipse 系统展示 首页 管理员功能…

如何利用TikTok矩阵源码实现自动定时发布和高效多账号管理

在如今社交媒体的盛行下,TikTok已成为全球范围内最受欢迎的短视频平台之一。对于那些希望提高效率的内容创作者而言,手动发布和管理多个TikTok账号可能会是一项繁琐且耗时的任务。幸运的是,通过利用TikTok矩阵源码,我们可以实现自…

docker hub仓库被禁用,镜像加速器站点替换

整理 站点整理之前用的daemon.json,现更改镜像加速地址替换自己的docker加速器daemon.json前面加https:// 站点整理 之前用的daemon.json,现更改镜像加速地址 vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xgbe4ey.mirror.aliyuncs.com",…

利用原生HTML + CSS + JS实现歌词滚动

对于很多音乐APP,都有这么一个功能,就是根据歌曲的进度来控制对应的歌词滚动,如下图所示: 大概这样的效果,我此次是使用原生的HTMLCSSJS来实现的,以下是具体的实现过程。 1. 数据获取与处理 对于数据来源&…

揭秘低代码平台:解锁表尾统计方案

前言 在现代Web应用中,数据表格是常见的界面元素之一,用于展示和管理大量的数据。而vxe-table作为Vue.js生态中一款优秀的数据表格组件,提供了丰富的功能和灵活的配置选项,使得开发者可以轻松地构建强大的数据展示界面。 然而&…

普林斯顿大学教授终于把算法整理成图解笔记

普林斯顿大学教授终于把算法整理成图解笔记了!!! 这些年虽然学到的编程知识越来越多,但是我对算法却始终没搞明白,直到偶然间看到这份笔记,我才认识到这些概念是多么简单。 对于很多刚入门的小伙伴来说&am…

充电学习—1、psy框架梳理

一、linux充电驱动代码框架: APP 层 该部分属于电量上报的最后的环节。其主要工作是:监听系统广播并对 UI 作出相应更新,包括电池电量百分比,充电状态,低电提醒,led 指示灯,异常提醒等FrameWork…

字符串专题详解

目录 字符串hash进阶 KMP算法 next数组 KMP算法 KMP算法优化 字符串hash进阶 字符串hash是指将一个字符串S映射为一个整数,使得该整数可以尽可能唯一地代表字符串S。那么在一定程度上,如果两个字符串转换成的整数相等,就可以认为这两个…

Typora—适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器

Typora 是一款适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器,它以其简洁易用的界面和强大的功能受到了众多用户的喜爱。 首先,Typora 的界面设计非常简洁直观,没有过多繁杂的菜单和按钮,让用户能够专注于写作本身。它采用实时…

【计算机毕业设计】235基于微信小程序点餐系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

抖音用户新作品监控助手,第一时间获取博主作品信息。

声明: 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。包含关注,点赞等 抖音新作品监控助手系统是一个功能强大的…

华火新能源集成灶评测:创新与品质的融合

在厨房电器的不断推陈出新中,华火新能源集成灶以其独特的魅力进入了人们的视野。今天,我们就来深入评测这款备受关注的产品——华火新能源集成灶 一、华火新能源集成灶的创新与环保 首先,我们先来探讨新能源集成灶的整体表现。华火新能源集成…

Java健身私教服务师傅小程序APP源码(APP+小程序+公众号+H5)

强身健体,私人定制的健身之旅 🏋️ 引言:探索私人健身新纪元 在现代都市的快节奏生活中,越来越多的人开始注重身体健康和健身塑形。然而,传统的健身房模式可能无法满足每个人的个性化需求。这时,一款名为…

如何利用V-Ray优化渲染效果——渲染100邀请码【7788】

3dmax效果图云渲染--渲染100 以3ds Max2025、VR6.2、CR11.2等最新版本为基础,兼容fp、acescg等常用插件,同时UT滤镜等参数也得到了同步支持。 注册填邀清码[7788]领30元礼包和免费渲染券哦~ 第一步:初次渲染 打开场景并将V-Ray设置为当前渲染…