MySQL的基础架构简述

news2025/1/16 17:02:30

文章目录

      • 一、一条SQL查询语句是如何执行的
        • 1、连接器
        • 2、查询缓存
        • 3、分析器
        • 4、优化器
        • 5、执行器

一、一条SQL查询语句是如何执行的

     开篇先上基本架构示意图🤗:
在这里插入图片描述
     大体来说,MySQL可以分为 Server 层和存储引擎两部分。
     Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
     存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。比较常见的是 InnoDB。
    

1、连接器

     使用数据库的第一步总是连接数据库,连接器起到和客户端建立连接、获取权限、维持和管理连接的作用。
     在经典的 TCP 握手后,连接器就要开始认证身份,用输入的用户名和密码做认证,若用户名或密码不对,就会收到一个"Access denied for user"的错误,然后客户端程序结束执行;若通过,连接器会到权限表里面查出拥有的权限,之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。换言之,一个用户成功建立连接后,即使使用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限,修改完成后,需要新建连接,才会使用新的权限设置。
     连接完成后,如果没有后续的动作,这个连接就处于空闲状态,可以在show processlist 命令查看状态。客户端如果太长时间没动静,连接器就会自动将它断开,想继续使用则需要重连。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。
     在数据库里,长连接是指 连接成功后,如果客户端持续有请求,则一直使用同一个连接;短连接则是指 每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
     建立连接的过程通常比较复杂,所以建议尽量减少建立连接,尽量使用长连接。不过全部使用长连接后,可能出现有时 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象中的(Q:为啥这样设计?执行过程消耗的是连接对象的内存?)这些资源会在连接断开时才释放,所以如果长连接累积下来,可能导致占用内存太大,OOM而被系统强制杀掉,表现为MySQL异常重启。
     解决该问题可考虑:
1、定期断开长连接,或者 程序里判断 执行过一个占用内存的大查询后,断开连接,之后需要查询再重连。
2、如果用的是 5.7 及以上版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚创建完时的状态。(Q:这是什么原理?是把执行过程中临时使用的内存给释放掉了吗?)
    

2、查询缓存

     MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。 key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。
     不过大多数情况下还是建议不要使用查询缓存,因为查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。所以对于更新压力大的数据库来说,查询缓存的命中率会非常低,除非某个业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
     在 8.0 之前,可以“按需使用”,将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,如:

mysql> select SQL_CACHE * from T where ID=10

     在 8.0 之后,查询缓存的整块功能被删掉了。

3、分析器

     如果没有命中查询缓存,就要开始真正执行语句了。
     具体来说就是需要根据语法规则,比如把 select 识别成查询语句、识别表名、字段名 等。
    

4、优化器

     优化器是在表有多个索引时,决定使用哪个索引,或者在一个语句有多表关联时,决定各个表的连接顺序。比如执行以下语句:

mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;

     既可以先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20;也可以先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10。
     这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。
    

5、执行器

     开始执行的时候,会先判断一下对这个表是否有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就打开表继续执行。
     打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
     比如某个表 T 的 ID 字段没有索引,那么执行器的执行流程是这样的:
     调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
     调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
     执行器将上述遍历过程中 所有满足条件的行组成的记录集 作为结果集 返回给客户端。至此,这个语句就执行完成了。
     对于有索引的表,执行的逻辑也差不多。
     第一次调用的是“取满足条件的第一行” 这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。
     在数据库的慢查询日志中看到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。


Q:如果表 T 中没有字段 k,而执行 select * from T where k=1, 会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在哪个阶段报出来的呢?
A:我觉得是在分析器阶段,识别列时。


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

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

相关文章

大一作业HTML网页作业 HTML校园篮球网页作业(12个页面)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

前沿系列--简述Diffusion Model 扩散模型(无代码版本)

文章目录前言why扩散简述how如何扩散逆向过程小结流程训练过程预测过程总结前言 OK,今天的话,我们来搞一下这个扩散模型,来对这个玩意进行一个简单的了解,因为这个也是目前还算比较前沿的东西,也挺有用的,…

CSAPP-Lab2 BombLab解析

文章目录ReferencePhase1Phase2Phase3Phase4Phase5Phase6Part1Part2Part3Part4Part5Part6SecretBombSummaryReference GDB Command Reference - disassemble command:怎么使用GDB进行反汇编调试GDB X CommandGDB and Debugging:GDB上手教程和如何进行de…

大一作业HTML网页作业 HTML CSS制作二十四节气网页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

背包问题:蛇优化算法(Snake Optimizer,SO)求解背包问题(Knapsack Problem,KP)提供Matlab代码

一、背包问题 1.1背包问题描述 背包问题(Knapsack Problem,KP)是一种重要的组合优化问题,在生活的许多领域都有着十分广泛的应用。背包问题可以描述为:给定一个背包和n种物品,其中,背包的容量为VVV ,第i …

Linux tar报错 无法 stat: 没有那个文件或目录 tar: 由于前次错误,将以上次的错误状态退出

解决方法 解决方式:-czf 的f必须在最后,因为f标识指定压缩后的文件名,f后面紧跟着的字符串就是你所指定的压缩后的文件名,所以f必须在后面 我记忆的方法:czf 吃早饭 举例:压缩多个文件、目录,压缩后得到的文…

Go语言GOPATH是什么

一、GOPATH的概念 GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录(也称为工作区), 是存放 Golang 项目代码的文件路径, GOPATH 适合处理大量 Go语言源码、多个包组合而成的复杂工程。 工作目录是一个工程开发的相对…

【机器学习】特征独立性检验-特征太多删特征-删who呢

总结 MvTest独立性分析方法——检验数值型特征与label是否有关系,删除与label无关(独立)的特征;corr协方差函数 相关性分析——找到数值型特征与数值型特征之间相关性高的数值型特征,然后删除(相关性高的数…

Xcode 导入共享代码文件却提示找不到其中方法或类型的原因与解决

文章目录 问题现象问题分析1. 原景重现2. 为什么找不到共享代码文件中的方法?3. 解决之道总结结束语问题现象 正所谓“一个好汉三个帮,一块篱笆三个桩”,开发一款优秀的 App 也绝对少不了第三方高质量代码的加持。 但有时候,我们明明已在 Xcode 中导入了第三方共享代码文…

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.3 初识Caffeine

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.3 初识Caffeine46.3.1 本地进程缓存46.3.2 Caffeine 示例46 JVM 进程缓存 46.3 初…

openGemini v0.2.0版本正式发布:5大特性全面增强

摘要:openGemini是华为云面向物联网和运维监控场景开源的一款云原生分布式时序数据库,兼容InfluxDB API,具有高性能、高并发、高扩展等特点。openGemini是华为云面向物联网和运维监控场景开源的一款云原生分布式时序数据库,兼容In…

Docker redis Connection refused 问题排查

问题描述: 用 docker分别运行2个容器,一个spring boot应用,一个是redis 然后发现Spring boot项目无法访问redis。在本地启动Spring boot项目可以访问Redis,然后打成JAR直接启动也能访问。但是做成容器访问Redis却总是报错。 2022-12-16 06:…

RK3588 调试 phy

参考:Rockchip_Developer_Guide_Linux_GMAC_CN Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN GMAC 接口电路 RK3588 芯片拥有 2 个 GMAC 控制器,提供 RMII 或 RGMII 接口连接外置的 Ethernet PHY GMAC 控制器支持以下功能: …

LSTM前向传播代码实现——LSTM从零实现系列(3)

一、前言 这个LSTM系列是在学习时间序列预测过程中的一些学习笔记,包含理论分析和源码实现两部分。本质属于进阶内容,因此神经网络的基础内容不做过多讲解,想学习基础,可看之前的神经网络入门系列文章: https://blog.…

全自动化数据洞察!数据分布对比可视化!

💡 作者:韩信子ShowMeAI 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 本文地址:https://www.showmeai.tech/article-detail/411 📢 声明:版权所有,转…

几种数据库jar包获取方式

摘要:以下提供的都是各个数据库较为官方的jar包获取方式。本文分享自华为云社区《JDBC连接相关jar包获取及上传管理中心白名单处理》,作者:HuaWei XYe。 jar包获取 以下提供的都是各个数据库较为官方的jar包获取方式 1、Mysql https://de…

C#启程—游戏开发笔记

文章目录ideRider下载和安装创建C#基础工程(包含form)Rider去除语法警告C#笔记namespace找不到某个class(命名空间)c#相对路径(比较特别)双缓存技术窗体事件绑定窗体初始属性方法生成调式绑定事件成功窗体中…

再探Vue3响应式系统

欲看懂这一篇还是建议先看上一篇,这一篇我们继续往下走 一、嵌套问题 🖖先看背景 在这段代码里面,question1里面嵌套了question2,所以question1的执行会导致question2的执行 let temp1 ,temp2; function question1() {console.…

基于java+springmvc+mybatis+vue+mysql的电子资源管理系统

项目介绍 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就…

AI加速自动驾驶进程,景联文科技提供数据采集标注服务

“当前,路面上搭载各级别自动驾驶系统的车辆数量逐渐增多。对自动驾驶领域头部企业来说,为了保持自身的竞争优势并加速自动驾驶应用安全落地进程,需要依靠大量的高质量标注数据来训练优化自动驾驶相关算法模型。数据作为AI技术的底层基础&…