MySQL基础架构详解

news2024/11/23 23:57:09

概述

我们学习东西,都不应该是先去了解细节,而是应该窥其全貌,这样才能从高纬度去理解问题,同样我们学习mysql也是一样的,我们应该先了解整个mysql架构,及来龙去脉,才能更好的掌握它。下面我们开始深入浅出的方式了解mysq基础架构知识。

SQL执行的来龙去脉

我们学习MySQL的时候,会编写SQL语句,如 select * from T where id=0这里查询T表,条件ID等于0。当我们执行这条SQL语句的时候,返回一个结果,却不知道这条SQL语句在MySQL里面的执行流程。如果我们深入去了解这个条SQL的执行过程,我们会发现MySQL在执行SQL过程中会经历非常多步骤,每一个步骤都有大量的功能支持,下面我们一一拆解这些功能,把它当成一辆完成的车一样,将零部件一件件拆解下来,深刻认识这些零件,让我们深入理解这些零件在MySQL所体现的作用。

SQL执行流程图
在这里插入图片描述

连接器

在使用MySQL的时候,用户会先对MySQL进行连接,在这时我们直面的第一个零件就是连接器,连接器负责和客户端建立连接,获取权限,维持和管理连接。连接命令 mysql -h ір − P ір -P ірPport -u$user -p执行完命令后,则建立连接,这个建立连接过程中会进行经典的TCP握手交互,之后认证身份,认证成功后会验证当前用户的权限,用于之后这个连接里面的权限判断逻辑,都会依赖此时读到的权限。
当我们建立连接后,我们可以使用show processlist 查看所有连接情况,当command 列显示为 “Sleep”时说明这个行记录是空闲连接。
如果当前连接的客户端太长时间没有活跃,连接器将会自动断开,这个时间,我们可以通过wait_timeout 控制,这个参数默认是8小时。
如果连接被断开之后,客户端再次发起请求连接,会收到一个错误提醒:Lost connection to MySQL server during query。如果这个时候你看到这个信息,想要继续操作,则需要重新连接,才能继续执行。长连接在数据库里面使用,长连接是指当客户端连接成功后,如果客户端有持续请求,则会一直使用这个连接。短连接在数据库使用,短连接是指客户端连接成功后,客户端使用一次这个连接后,这个连接就会关闭,如果下次需要连接则需要重新创建短连接,这个创建连接的成本是很高的,所以一般在数据库中建议使用长连接,避免频繁创建连接,浪费资源。当时使用长连接也会造成一些问题,如,如果大量连接创建后,我们会观察服务器内存,会发现内存占用较高,因为创建大量连接会导致系统内存占用过高,此时还可能经历被系统杀掉(OOM),从而出现MySQL服务重启的现象。
怎么解决长连接带来的问题呢,有两种方案如下?
● 定期断开长连接,避免大量无用连接而占用内存。在使用一段时间内,在程序里面判断一个占用内存的查询,断开连接,之后要查询在重新连接。
● 如果使用的MySQL5.7 或者比5.7更新的版本,可以在执行一次占用内存较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源,这个过程不需要重连和重新做权限验证,但是这个操作会讲连接恢复到刚刚连接时的状态。

查询缓存(mysql8已经废弃)

建立连接后,开始执行SQL语句,执行逻辑会先查询缓存。MySQL拿到一个查询请求后, 会先到查询缓存看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式, 被直接缓存在内存中。 key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key, 那么这个value就会被直接返回给客户端。
但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。
查询缓存的失效非常频繁, 只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来, 还没使用呢, 就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。
比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。MySQL也提供了这种“按需使用”的方式。你可以将参数query_cache_type设置成 DEMAND,这样对于默认的SQL语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,像下面这个语句一样:select SQL_CACHE * from T where ID=10;
MySQL 8.0版本直接将查询缓存的整块功能删掉了, 8.0开始彻底没有这个功能了。

分析器

如果没有命中缓存,则会进行执行SQL环节,在到真正执行SQL语句前,会进行SQL语句分析,然后对SQL语句的解析。而分析器又被称为“词法分析器”,你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识
别出里面的字符串分别是什么,代表什么。做完了这些识别以后, 就要做“语法分析”。根据词法分析的结果, 语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。

优化器

经过了分析器, MySQL就知道你要做什么了。 在开始执行之前,还要先经过优化器的处理。优化器是在表里面有多个索引的时候,决定使用哪个索引,或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

开始执行的时候, 要先判断一下你对这个表T有没有执行查询的权限,如果没有,就会返回没有权限的错误,执行器调用一次。 如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引
擎提供的接口,在引擎内部则扫描了多行, 因此引擎扫描行数跟rows_examined并不是完全相同的。

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

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

相关文章

阿里云 :推出通义大模型编码助手产品【通义灵码】

本心、输入输出、结果 文章目录 阿里云 :推出通义大模型编码助手产品【通义灵码】前言通义灵码简介主要功能主要功能点 支持的语言和 IDEjetbrains IDEA 安装计费相关弘扬爱国精神 阿里云 :推出通义大模型编码助手产品【通义灵码】 编辑:简简…

java实现wav的重采样

在处理一些用户上传的音频的时候,往往根据用户的设备不通,文件格式难以统一,尤其是涉及到算法模型相关的,更是令人头疼,这里提供两种思路解决这个问题。 不借助三方库 这种采用的是javax.sound.sampled下的包来实现&a…

数据结构之顺序表的实现(详解!附完整代码)

线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构 常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结…

十五、W5100S/W5500+RP2040树莓派Pico<TFTP Client>

文章目录 1 前言2 简介2 .1 什么是TFTP?2.2 TFTP的优点2.3 TFTP和FTP对比2.4 TFTP应用场景 3 WIZnet以太网芯片4 ARP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 一般来说&#xff0…

金蝶云星空BOS设计器中基础资料字段属性“过滤”设置获取当前界面的基础资料值作为查询条件

文章目录 金蝶云星空BOS设计器中基础资料字段属性“过滤”设置获取当前界面的基础资料值作为查询条件背景说明业务需求格式BOS配置 金蝶云星空BOS设计器中基础资料字段属性“过滤”设置获取当前界面的基础资料值作为查询条件 背景说明 序列号档案是基础资料,资料里…

delphi程序启动时带参数运行的例子

这里有一个坑,就是参数会减少一个 //需要引用这个单元 uses shellapiprocedure TForm1.Button5Click(Sender: TObject); varParams: string; begin //由于第三个参数不会显示,需要额外的多补充一个参数,而且第一个参数会变成程序的运行路径P…

什么是超级托斯卡纳葡萄酒?

超级托斯卡纳葡萄酒通常被认为是在托斯卡纳用国际葡萄品种制成的葡萄酒,如赤霞珠、品丽珠或梅洛,而不是传统的托斯卡纳葡萄桑娇维塞。来自云仓酒庄品牌雷盛红酒分享这些葡萄酒可能包含一些桑娇维塞,但这通常不是混合中的主要葡萄。这些大胆的…

工程车云管家|叉车智能管家安卓主板方案

工程车云管家是一款功能强大的设备管理和调度系统,它可以实时追踪工程车或机械设备的地理位置、视频、行驶轨迹、油位油耗、工作时长和地点、以及运行状况等信息,并将这些数据通过云平台存储、分析,并发送到管理者的手机上。这使得管理者能够…

Windows安装svn命令

1、svn命令下载地址 https://www.visualsvn.com/downloads/; 2、安装svn命令 3、测试svn命令是否安装成功

Java修仙传之神奇的ES2(巧妙的查询及处理)

SDL语句查询 查询的基本语法 GET /indexName/_search {"query": {"查询类型": {"查询条件": "条件值"}} } 根据文档id查询 #查询文档 GET hotel/_doc/36934 查询所有 会弹出该索引库下所有文档// 查询所有 GET /indexName/_searc…

quickapp_快应用_快应用组件

快应用组件 web组件web页面与快应用页面通信网页接收/发送消息网页接收消息 快应用页面接收/发送消息给网页发送消息 通信前提- trustedurl web组件 作用:用于显示在线的 html 页面(可以嵌入三方页面或者某些不太重要的页面) 缺点:打开会比原生慢一点&…

centos的docker镜像下载ffmpeg的方式

ffmpeg是业界比较好用的开源的音频处理工具,当我们在实际业务中使用ffmpeg的时候,直接使用yum安装回提示找不到ffmpeg的包,遇到这种情况,可以通过以下方式来进行安装(docker环境)。 已经拥有镜像 更新源 …

激光雷达(LiDAR)技术

激光雷达 LiDAR 不久前引发热议的iPhone 12 Pro机型,配备了全新的LiDAR扫描仪,只需点击自带的Measure应用程序,便能立即测量一个人的身高。 在人工智能和自动驾驶领域,神奇的LiDAR又有着怎样的用处?随着汽车巨头们在…

Redis系列-四种部署方式-单机部署+主从模式+哨兵模式【7】

目录 Redis系列-四种部署方式-单机部署主从模式【7】redis-四种部署模式单机模式主从模式数据同步的方式全量数据同步增量数据同步 Redis哨兵模式总结缺点:哨兵模式应用sentinel.conf配置项 REF 个人主页: 【⭐️个人主页】 需要您的【💖 点赞关注】支持…

geoserver发布同一字段的多值渲染

Geoserver之同一字段的多值渲染 有时候我们需要对一个shp的某一字段值中的不同值进行区分展示,但是一般的渲染都是按照统一图层展示的,因此为了更好的效果,我们选择使用uDig等工具处理。 文章目录 Geoserver之同一字段的多值渲染前言一共是分…

【HarmonyOS】HarmonyOS Test测试用例中一些断言API的使用

【关键词】 单元测试框架、HarmonyOS Test、assertThrowError、assertFail、assertEqual 【测试代码及测试结果展示】 这里以新建API9工程自动生成的ohosTest来编写单元测试代码。 1、 测试代码: import { describe, it, expect } from ohos/hypium import abil…

本地电脑如何连接使用腾讯云服务器

如何连接使用腾讯云服务器 在自己的电脑上,单击 ,在搜索中,输入 mstsc,按 Enter,打开远程桌面连接对话框。如下图所示: 在“计算机”后面,输入 服务器的公网 IP,就是上节大图左侧…

十三、W5100S/W5500+RP2040树莓派Pico<FTP Server>

文章目录 1. 前言2. 相关简介2.1 简述2.2 原理2.3 优点2.4 应用 3. WIZnet以太网芯片4. FTP Server运行测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 在当今的信息化时代,互联网已经成为人们生活、工作不可…

7天入门python系列之第二天python 基础语法

第2天主要是学习Python的基础知识 编者打算开一个python 初学主题的系列文章,用于指导想要学习python的同学。关于文章有任何疑问都可以私信作者。对于初学者想在7天内入门Python,这是一个紧凑的学习计划。但并不是不可完成的。第二天开始python 基础知…

查分小程序,教学大作用

数字化时代,技术已经深深的改变了我们的生活和工作方式。当然,教育领域也不例外。如果你是一位老师,你可能会想知道如何利用这些技术工具来提高学生的学习体验和成绩。今天,我们就来聊聊如何用各种代码、Excel等工具,打…