MySQL原理(一)架构组成之逻辑模块(2)缓存机制

前面提到了mysql的逻辑模块中包含Query Cache 。

一、查询缓存

1、作用

MySQL查询缓存即缓存查询数据的SQL文本及查询结果,用Key-Value的形式保存在服务器内存中。当查询命中缓存,MySQL会立刻返回结果,跳过了解析,优化和执行阶段。

2、查询缓存的命中条件

(1)首先确保开启了查询缓存。
(2)MySQL将缓存存放在一个引用表(类似HashMap的数据结构)。通过一个哈希值索引,这个索引通过查询本身、当前查询的数据库、客户端协议、版本号等一些可能影响结果的信息计算得出。
(3)在判断命中前,MySQL不会解析SQl,首先使用SQL去查询缓存,SQL上有任何字符不同,如:空格、注释等都会导致缓存命中失败。
(4)如果查询SQL中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL库中的系统表、其查询结果都不会被缓存。如:like、 now()、current_date()函数等。

3、缓存失效

(1)查询缓存的失效非常频繁,在表结构或数据发生改变时,查询缓存中的数据不再有效,查询缓存值的相关条目将被清空。

insertupdatedeletetruncatealter tabledrop database都会导致缓存数据的失效。

(2)MySQL重启也会导致cache中的内容全部丢失。

4、应用场景

对于频繁更新的表,查询缓存合适,查询缓存更加适用于“静态表”。

5、弊端

(1)任何查询语句在开始之前都会经过缓存检查,即使这条SQL永远不会命中缓存。
(2)如果查询结果可以被缓存,那么执行完后,会将结果存入缓存,也会带来额外的系统消耗。
(3)写入或更新时,MySQL必须将对应表的所有缓存都设置失效。如果查询缓存很大或碎片很多时,这个操作可能给系统带来很大的系统消耗。
(4)如果Query_cache非常大,该表的查询结构又比较多,查询语句失效也慢,一个更新或是Insert就会很慢,这样看到的就是Update或是Insert怎么这么慢了。

二、缓存的相关参数

1、查询缓存的参数
show variables like "%query_cache%";
参数注释
query_cache_type是否打开缓存,可选参数有:OFF(0):关闭 ,不使用查询缓存。ON(1):总是打开 ,始终使用查询缓存。 DEMAND(2):按需使用查询缓存,只有明确写了SQL_CACHE的查询才会写入缓存
query_cache_size缓存使用的总内存空间大小,单位是字节,这个值必须是1024的整数倍;否则MySQL实际分配可能跟这个数值有偏差。语句:SET GLOBAL query_cache_size = 134217728;
query_cache_min_res_unit分配内存块时的最小单位大小
query_cache_limitMySQL能够缓存的最大结果,如果超出,则增加 Qcache_not_cached的值,并删除查询结果
query_cache_wlock_invalidate如果某个数据表被锁住,是否仍然从缓存中返回数据,默认是OFF,表示仍然可以返回

2、GLOBAL STATUS 中关于缓存的相关参数
show global status like "%qcache%";
参数注释
Qcache_free_blocks缓存池中空闲块的个数
Qcache_free_memory缓存中空闲内存量
Qcache_hits缓存命中次数
Qcache_inserts缓存写入次数
Qcache_lowmen_prunes因内存不足删除缓存次数
Qcache_not_cached查询未被缓存次数,例如查询结果超出缓存块大小,查询中包含可变函数等
Qcache_queries_in_cache当前缓存中缓存的SQL数量
Qcache_total_blocks缓存总block数

三、缓存机制过程

1、MySQL在申请数据块时,首先要锁住空间块,然后找到合适大小的数据块,所以相对来说,分配内存块是一个非常慢的操作。

当有查询结果需要缓存时,先从空间A申请一个数据块B,然后将数据逐步写入数据块B,当数据块B空间用完时,向空间A申请数据块C,又向数据块C逐步写入,如此反复,直到查询结果全部写入完成,当数据块C还剩余部分空间D,这个剩余的空间D将被释放,并入到空闲空间A,而此时不会产生碎片。从上图看出,当有一条查询结果需要缓存时,不会产生缓存碎片。

2、空间碎片的产生

假设此时有两个查询结果需要缓存,且这两个查询结果都小于query_cache_min_res_unit设置的值,那么此时会有两个数据块正在写入数据。写入完成后,MySQL在回收剩余空间的时候,会发现在空间1和空间2中会有一个空隙(红色部分:由第一个空间块的剩余空隙产生),而空隙又小于query_cache_min_res_unit的值不能被再次使用,从而产生了碎片。

从上图可以看出,SQL查询1的剩余空间小于query_cache_min_res_unit参数的值,所以无法再次使用,从而产生了碎片。SQL查询2的空间则并入到空闲空间当中,得到了释放。

注意:由于缓存失效,从而产生太小的数据块无法使用,也会产生碎片。

3、总结:

(1)通过设置合理的query_cache_min_res_unit可以减少碎片的产生。

(2)通过命令FLUSH QUERY CACHE 完成碎片整理。

(3)使用RESET QUERY CACHE命令清空缓存。

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

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

相关文章

canvas路径剪裁clip(图文示例)

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

(软件分享)Fotor - AI照片编辑器

【应用名称】:Fotor - AI照片编辑器 【适用平台】:#Android 【软件标签】:#Fotor 【应用版本】:7.5.0.2➡7.5.1.5 【应用大小】:225MB 【软件说明】:软件升级更新。Fotor 包含编辑照片所需的所有工具。用户…

踩坑系列——mysql数据库字段类型为tinyint输入字符串条件查询无效

背景 排查问题发现有个查询sql的条件传的字符串‘ENABLE’,而数据库这个字段类型是tinyint,值只有0和1,看查询结果过滤出的都是值为0的数据。按自己理解这个语句应该查不出数据,但是结果非预期 排查 问了下ChatGpt给的回答是这…

@ 代码随想录算法训练营第6周(C语言)|Day37(贪心)

代码随想录算法训练营第6周(C语言)|Day37(贪心) Day37、贪心(包含题目 738.单调递增的数字 968.监控二叉树 ) 738.单调递增的数字 题目描述 给定一个非负整数 N,找出小于或等于 N 的最大的整…

CH395Q之CH395Q驱动库移植与驱动库分析(二)

本节主要介绍以下内容: 一、CH395Q驱动库移植 二、源码分析 一、CH395Q驱动库移植 驱动库移植主要有两个途径,一个是南京沁恒官方网址,一个是通过正点原子官方,原子官方对沁横官方提供的驱动库进行了完善与修改。自用的话推荐…

1个 THM 和多台 BSP 的通讯(以邦纳 BSP 系列 PLC 为例)

一.架构和接线如下图所示 二、建立连接 选择 PLC 的驱动,多台连接请勾选“次连接” “次连接总数”就是要连接的 PLC 台数。 设置触摸屏通讯参数;同时确保每台 PLC 的通讯参数与该设定相同(但站号不能相同)。 三、…

深度探讨ThreadLocal是否真的可能引发内存泄漏

目录 引言 1. ThreadLocal的基本原理 2. 潜在的内存泄漏原因 2.1 不正确的清理 2.2 长生命周期的ThreadLocal实例 3. 示例和解决方案 示例代码: 解决方案: 4. 结论 引言 在Java多线程编程中,ThreadLocal是一个强大的工具&#xff0…

LVS负载均衡对udp流量进行参数调整一例

本文记录一套百万会话级的LVS软负载均衡系统,从加权最少链接均衡算法调整为源主机散列算法并增加会话保持时间的配置过程。 一、调整原由 业务侧为了提升平台的设备连接会话保持能力,希望将LVS软负载均衡系统的均衡算法从加权最少链接均衡算法wlc调整为源主机散列算法sh,并…

HTML -- 常用标签

标签 表示HTML网页内容的一个最基本的组织单元,类似于语文中的标点符号, 标签的作用:告诉浏览器当前标签中的内容是什么,以什么格式在页面中进行呈现 单标签 单标签(只有一个标签名的标签)的标签格式&…

深入解剖指针篇(2)

目录 指针的使用 strlen的模拟实现 传值调用和传址调用 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 个人主页(找往期文章):我要学编程(ಥ_ಥ)-CSDN博客 指针的使用 strlen的模拟实现 库函数strlen的功能是求字符串…

1683. 无效的推文

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 表:Tweets ------------------------- | Column Name | Type | --------…

PySpark(二)RDD基础、RDD常见算子

目录 RDD RDD五大特性 RDD创建 RDD算子 常见的Transformation算子 map flatMap mapValues reduceByKey groupBy filter distinct union join intersection glom groupByKey groupByKey和reduceByKey的区别 ? sortBy sortByKey 常见的action算子 countByKey…

MySQL入门篇(10)-聚合函数的应用

MySQL数据库聚合函数的应用 在MySQL数据库中,聚合函数用于计算一组数据的统计值并返回结果。这些函数可以应用于查询语句中,对数据进行汇总、计数、平均值计算等操作。本文将介绍一些常用的MySQL聚合函数及其应用。 1. COUNT函数 COUNT函数用于计算指…

软考 系统分析师系列知识点之需求管理(2)

接前一篇文章:软考 系统分析师系列知识点之需求管理(1) 所属章节: 第11章. 软件需求工程 第8节. 需求管理 11.8.2 需求风险管理 人们做事情总希望一帆风顺,做项目也是如此,总是希望项目进展顺利&#xff…

Ubuntu18配置Docker

1.基本过程 1.更新软件源列表 sudo apt update2.安装软件包依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common3.在系统中添加Docker的官方密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - …

新概念英语第二册(49)上

【New words and expressions】生词和短语(13) tired adj. 厌烦的 real adj. 真正的 owner n. 主人 spring n. 弹簧 mattress …

erlang (erlang 操作模块)学习笔记(四)

map_size 1> map_size(#{a>1, b>2, c>3}). 3返回一个整数,即键值对的数量 max 2> max(1, 2). 2 3> max(1.0, 1). 1.0 4> max(1, 1.0). 1 5> max("abc", "b"). "b"返回 Term1 和 Term2 中最大的值。如果这…

前端JavaScript篇之ES6中数组新增了哪些扩展?

目录 ES6中数组新增了哪些扩展?1. **箭头函数:**2. **扩展运算符(Spread Operator):**3. **解构赋值:**4. **Array.from()方法:**5. **Array.of()方法:**6. **find()和findIndex()方法&#xf…

Python入门到精通(七)——Python文件操作

Python文件操作 一、文件的编码 二、文件的读取 1、操作汇总 2、model 常用的三种基础访问模式 三、文件的写入 四、文件的追加 五、综合案例 一、文件的编码 1、什么是编码? 编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。编…

Flink1.14新版KafkaSource和KafkaSink实践使用(自定义反序列化器、Topic选择器、序列化器、分区器)

前言 在官方文档的描述中,API FlinkKafkaConsumer和FlinkKafkaProducer将在后续版本陆续弃用、移除,所以在未来生产中有版本升级的情况下,新API KafkaSource和KafkaSink还是有必要学会使用的。下面介绍下基于新API的一些自定义类以及主程序的…