对 MYSQL 架构的了解
MySQL 是一种广泛使用的关系型数据库管理系统,其架构主要包括以下几个关键部分:
一、连接层
客户端连接管理:MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序(如使用 Java、Python 等语言编写的程序)尝试连接到 MySQL 服务器时,连接层负责建立连接。它会验证客户端提供的用户名、密码等认证信息,只有认证通过的客户端才能成功建立连接。例如,一个 Web 应用服务器要访问 MySQL 数据库存储用户信息,就需要先在连接层进行身份验证。
通信协议处理:MySQL 使用自己的通信协议来在客户端和服务器之间传递数据和命令。连接层负责解析客户端发送的 SQL 语句请求,并将服务器的响应结果按照协议格式返回给客户端。
二、服务层(SQL 层)
查询解析器(Parser)
词法分析:当客户端发送 SQL 语句后,查询解析器首先会对 SQL 语句进行词法分析。它会将 SQL 语句分解为一个个的单词(Token),比如 SELECT、FROM、WHERE 等关键字,以及表名、列名、数值等标识符。例如,对于语句 “SELECT * FROM users WHERE age> 18”,会分解出 “SELECT”“*”“FROM”“users”“WHERE”“age”“>”“18” 这些单词。
语法分析:在词法分析的基础上,语法分析器会根据 MySQL 的语法规则来检查 SQL 语句的语法结构是否正确。如果 SQL 语句不符合语法规则,就会返回语法错误信息给客户端。例如,语句 “SELECT * FORM users”(错误地拼写了 FROM)就会被语法分析器检测出错误。
查询优化器(Optimizer)
成本估算:优化器会对解析后的 SQL 查询计划进行评估。它会考虑多种因素来估算不同执行计划的成本,如索引的使用情况、表的连接方式(如内连接、外连接)、数据量大小等。例如,对于一个涉及多表连接的查询,优化器会分析是先连接哪两个表成本更低。
生成最优执行计划:基于成本估算,优化器会选择一个它认为是最优的执行计划来执行 SQL 查询。这个执行计划可能包括决定使用哪些索引、以何种顺序访问表等。例如,在一个有索引的表上进行查询时,优化器会判断是否使用索引来提高查询速度。
查询执行器(Executor)
根据优化器生成的执行计划,查询执行器负责实际执行 SQL 查询操作。它会与存储引擎进行交互,读取或写入数据。例如,执行一个 SELECT 语句时,执行器会从存储引擎中获取符合条件的数据行,然后将这些数据返回给服务层进行后续处理。
事务管理:MySQL 支持事务处理,执行器在处理事务相关的 SQL 语句(如 BEGIN、COMMIT、ROLLBACK 等)时,会负责协调事务的开始、提交和回滚操作。它确保事务的原子性、一致性、隔离性和持久性(ACID)特性。例如,在一个银行转账事务中,如果转账操作失败,执行器会根据事务的回滚机制,将数据恢复到转账之前的状态。
三、存储引擎层
存储引擎概述:MySQL 支持多种存储引擎,如 InnoDB、MyISAM、Memory 等。不同的存储引擎有不同的特点,适用于不同的应用场景。存储引擎负责数据的存储和读取操作。
InnoDB 存储引擎(常用)
存储结构:InnoDB 采用聚簇索引(Clustered Index)来存储数据。聚簇索引的叶子节点存储了实际的数据行,而非聚簇索引的叶子节点存储的是指向聚簇索引的指针。例如,在一个以主键为聚簇索引的表中,数据行按照主键值的顺序存储在磁盘上。
事务支持:InnoDB 是支持事务的存储引擎,通过事务日志(Redo Log 和 Undo Log)来保证事务的 ACID 特性。Redo Log 用于在系统崩溃后恢复已经提交的事务修改,Undo Log 用于回滚未完成的事务。
行级锁:InnoDB 支持行级锁,这使得在多用户并发访问数据库时,可以更精细地控制并发操作。例如,当多个用户同时对同一张表中的不同行进行更新操作时,行级锁可以减少锁冲突,提高并发性能。
MyISAM 存储引擎
存储结构:MyISAM 存储引擎的数据文件和索引文件是分开存储的。数据文件存储实际的数据行,索引文件存储索引信息。这种存储方式使得在某些情况下,索引的维护和数据的读写操作相对简单。
性能特点:MyISAM 在查询操作频繁、对事务支持要求不高的场景下有较好的性能。但是它不支持事务,也不支持行级锁,只支持表级锁。例如,在一个以读为主的数据库应用中,如果不需要事务处理,MyISAM 可能是一个选择。
四、缓存层
查询缓存(早期版本有,较新版本已逐渐废弃):在早期的 MySQL 版本中,查询缓存用于存储查询结果。当一个新的查询到来时,服务器会先检查查询缓存中是否已经存在相同的查询结果。如果存在,就直接从缓存中返回结果,而不需要再次执行查询。但是,由于缓存失效机制复杂,在高并发和频繁更新数据的场景下,查询缓存可能会带来性能问题,所以在较新版本中逐渐被弱化。
缓冲池(Buffer Pool):InnoDB 存储引擎等有缓冲池机制。缓冲池是一块内存区域,用于缓存从磁盘读取的数据页和索引页。当查询需要读取数据时,如果数据已经在缓冲池中,就可以直接从内存中获取,大大提高了查询速度。缓冲池会根据一定的算法(如 LRU,最近最少使用算法)来管理内存中的数据页,将经常访问的数据页保留在缓冲池中,将不经常访问的数据页淘汰出缓冲池。
相关文章:
对 MYSQL 架构的了解
MySQL 是一种广泛使用的关系型数据库管理系统,其架构主要包括以下几个关键部分: 一、连接层 客户端连接管理:MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序(如使用 Java、Python 等语言编写的程序)…...
C#中方法参数传值和传引用的情况
对于引用类型 - 传类类型的具体值时 此时传的是引用 - 单纯传类类型 此时传的是个test引用的副本,在方法内修改的是这个副本的指向 传string,集合同理,只要是指向新对象,就是引用副本在指向 对于值类型 - 传普通值类型 …...
获取显示器(主/副屏)友好名称(FriendlyName)
在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...
Apache Solr RCE(CVE-2017-12629)--vulhub
Apache Solr 远程命令执行漏洞(CVE-2017-12629) Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…...
2.3 携程的hook实现及dlsym函数
背景知识:(排除static 情况) 一个进程中可以有相同的命名吗? -- 不能 两个进程之间可以有相同的命名吗?--可以 一个进程和另一个静态库可以有相同的命名吗?--不能 一个进程和另一个动态库之间可以有相同…...
机器学习之KNN算法
K-Nearest Neighbors (KNN) 是一种常见的机器学习算法,广泛应用于分类和回归问题。KNN是一种基于实例的学习方法,它利用训练数据集的实例来进行分类或回归预测。在KNN中,预测的结果依赖于距离度量函数计算出的最近邻实例的标签或值。下面我们…...
《全排列问题》
题目描述 按照字典序输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 由 1∼n1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留…...
pycharm 快捷键
PyCharm 是一款功能强大的集成开发环境(IDE),提供了丰富的快捷键来提高开发效率。以下是一些常用的 PyCharm 快捷键(基于 Windows/Linux 系统,Mac 系统可能略有不同): 通用快捷键 功能快捷键&a…...
若依微服务如何获取用户登录信息
文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步:后端获取当前用户信息第二步:前端获取当前用户信息 5、运行结果6、总结 1、需求提出 在微服务架构中,获取当前用户的登录信息是开发常见的需求。无论是后端处理业务…...
RunCam WiFiLink连接手机图传测试
RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线(易忘) 2.打开摄像头前面的盖子(易忘) 3.接上直流电源,红线为正,黑线为负 4.直流电源设置电压为14v,电流为3.15A, 通…...
TCP三次握手,四次挥手
三次握手 第一次握手:客户端向服务器发送一个 SYN 包,其中 SYN 标志位被设置为 1,表示客户端请求建立连接,并随机生成一个初始序列号 seqx 。此时客户端进入 SYN_SENT 状态,等待服务器的确认1.第二次握手:服…...
Mono里建立调试C#脚本运行环境
前面已经介绍了怎么样来执行一个嵌入式的脚本框架, 这个框架是mono编写的一个简单的例子。 如果不清楚,可以参考前文: https://blog.csdn.net/caimouse/article/details/144632391?spm=1001.2014.3001.5501 本文主要来介绍一下,我们的C#脚本是长得怎么样的,它大体如下…...
Linux dnf 包管理工具使用教程
简介 dnf 是基于 Red Hat Linux 发行版的下一代包管理工具,它代替 yum 提供更好的性能、更好的依赖处理和更好的模块化架构。 基础语法 dnf [options] [command] [package] 常用命令用法 更新元数据缓存 sudo dnf check-update# 检查已安装的包是否有可用的更…...
Java 创建线程的方式有哪几种
在 Java 中,创建线程的方式有四种,分别是:继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future、使用线程池。以下是详细的解释和通俗的举例: 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 步…...
计算机的错误计算(一百八十七)
摘要 用大模型计算 sin(123.456789). 其自变量为弧度。结果保留16位有效数字。第一个大模型是数学大模型。先是只分析,不计算;后经提醒,才给出结果,但是是错误结果。第二个大模型,直接给出了Python代码与结果…...
12. 最大括号深度
题目描述 现有一字符串仅由"(",")", "{","}", "[", "]"六种括号组成。若字符串满足以下条件之一, 则为无效字符串:任一类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号输出…...
进程与线程以及如何查看
长期补充,建议关注收藏! 定义 特性进程线程定义程序执行的基本单位执行中的最小单位资源拥有独立的内存空间和资源共享进程的资源开销创建和销毁的开销较大创建和销毁的开销较小执行单位进程中可以有多个线程线程是执行单元,必须依赖于进程并…...
BlueLM:以2.6万亿token铸就7B参数超大规模语言模型
一、介绍 BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型,本次发布包含 7B 基础 (base) 模型和 7B 对话 (chat) 模型,同时我们开源了支持 32K 的长文本基础 (base) 模型和对话 (chat) 模型。 更大量的优质数据 :高质量语料…...
Webpack学习笔记(4)
1.缓存 可以通过命中缓存降低网络流量,是网站加站速度更快。 然而在部署新版本时,不更改资源的文件名,浏览器可能认为你没有更新,所以会使用缓存版本。 由于缓存存在,获取新的代码成为问题。 接下来将配置webpack使…...
28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强
A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法:无模型水下图像增强方法:基于深度学习的水下图像增强方法: 论文方法概述像素分布…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
