MySQL系列:一句SQL,MySQL是怎么工作的?

对于MySQL而言,其实分为客户端与服务端。

  • 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端。

  • 客户端,负责发送请求到服务端并从服务端获取数据,客户端可以有多种形式,可以是我们通过mysql -uroot -p1234打开的黑窗口,也可以是我们使用的Nativecat、SQLyog等数据库连接工具,甚至我们的程序,也可以称作MySQL的客户端。

而当我们在mysql窗口或者数据库连接工具中输入一句sql后,我们就可以获取到想要的数据,这中间MySQL到底是怎么工作的呢?

在我们执行SQL后,例如一句简单的select * from user where name = ‘yanger’,客户端发送请求到服务端,请求到达Server层,会经过连接器、查询缓存、分析器、优化器、执行器等,最终通过存储引擎从文件系统获取数据或者插入数据到文件系统。

连接器

在客户端程序发起连接的时候,需要携带主机信息、用户名、密码,服务器程序会对客户端程序提供的这些信息进行认证,如果认证失败,服务器程序会拒绝连接。

连接命令大家都比较熟悉。

mysql -h$ip -P$port -u$user -p

输完命令之后,需要继续输入密码,密码也可以直接跟在 -p 后面,但这样可能会导致你的密码泄露,如果你连的是生产服务器,强烈建议你不要这么做。

MySQL采用TCP作为服务器和客户端之间的网络通信协议,完成 TCP 握手后,连接器主要做密码校验和权限获取。

  • 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误

  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限

MySQL的默认连接是8小时,由参数 wait_timeout 控制的,如果超过这个时间不使用,会自动断开,并在之后的操作中,抛出Lost connection to MySQL server during query的错误。

查询缓存

针对于查询语句,MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句,之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。如果命中缓存,将直接返回结果。如果不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

针对于更新语句,包含插入删除语句,MySQL 收到更新请求时,会把查询缓存中该表相关的缓存数据全部清空。

我们可以看到,只要有更新,缓存就会失效,而对于正常的业务,更新其实是比较频繁的,也就是说,其实MySQL的查询缓存命中率并不会很高,所以建议一般不到开启。

可以通过设置 query_cache_type 为 DEMAND 来关闭查询缓存功能。而事实上,在 MySQL 8.0 版本,更是直接移除了查询缓存这一个功能。

分析器

MySQL 首先需要对SQL语句进行分析,分析过程本质上算是一个编译过程,涉及词法解析、语法分析、语义分析等阶段,通过分析MySQL知道自己要做什么。

如果语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。

优化器

面对分析器拿到的结果,MySQL会做一些优化处理,例如在表里面有多个索引的时候,决定使用哪个索引,或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。我们可以使用EXPLAIN语句来查看某个语句的执行计划。

这里\G在命令窗口无法一行时,可以竖着展示结果,方便查看。

执行器

经过了分析器和优化器,就正式进行执行阶段了,不过执行之前,需要做权限验证,如果权限不足,就会抛出权限的错误。其实在查询缓存的时候,一样也会进行权限校验。

如果通过验证,执行器就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

存储引擎

MySQL支持非常多种存储引擎,常用的是InnoDB和MyISAM,MySQL的默认存储引擎是InnoDB。

假如我们选择是InnoDB引擎,对于查询,那InnoDB 会取这个表的第一行来进行判断是不是符合要求,符合则存在结果集中,否则继续进行下一行,直到该表的最后一行。

然后存储引擎将结果返回给执行器, 执行器拿着结果返回给客户端,这样一句SQL就执行完成了。



喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

【Mysql NDB Cluster 集群(CentOS 7)安装笔记一】

Mysql NDB Cluster 集群(CentOS 7)安装笔记 NDB集群核心概念 NDBCLUSTER(也称为NDB)是一个内存存储引擎,提供高可用性和数据保存功能。 NDBCLUSTER存储引擎可以配置一系列故障转移和负载平衡选项,但从集群级别的存储引擎开始是最容易的。NDB集群的NDB存储引擎包含一整套…

使用VS Code时如何切换Python版本?VS Code中如何在Python3与Python2之间自由切换?

1. 使用VS Code时如何切换Python版本?VS Code中如何在Python3与Python2之间自由切换? 2. 准备 2.1. 已添加Python2与Python3的安装目录到环境变量的Path所对应的值里 2.2. 已安装VSCode的Python插件 没安装的话,用VSCode打开Py文件就会提示让…

爱回收根关键字获取对应品牌的ID API 返回值深入解析

在数字化时代,二手商品交易市场日益繁荣,其中爱回收作为一个重要的平台,提供了一个便捷的接口,使得开发者能够通过API获取对应品牌的ID。本文将详细介绍如何使用爱回收的API,通过根关键字来获取品牌ID,并提…

给自己域名生成tls证书并在服务器进行配置

背景 自己搭建的服务器,使用https访问时会报不安全,给人一种不靠谱的赶脚,于是乎,决定使用个免费的方式来配置个证书解决这个问题 解决 首先需要有自己的公网域名,我的是某里云购买的,如何购买域名这里不聊 需要一…

java反序列化学习之CommonCollections3利用链的学习

一、前言 在前文中,我们学习了Java的类加载过程,类加载器以及Java中加载字节码的一些方法,其中介绍了TemplatesImpl,TemplatesImpl是一个可以加载字节码的类,通过调用其newTransformer()方法,即可执行这段字…

钨酸铵溶液净化除钾钠杂质

钨酸铵溶液的主要用途包括制造三氧化钨、蓝色氧化钨、偏钨酸铵及其他钨化合物,以及作为石油化工行业的添加剂‌‌ 制造其他钨化合物: 钨酸铵溶液可以用于制造三氧化钨或蓝色氧化钨,这些化合物进一步用于生产金属钨粉。金属钨粉是制造钨条、钨…

线程安全的单例模式

单列模式是校考中最常考的设计模式之一 啥是设计模式? 设计模式就好比好比向其中的“棋谱”,红方当头炮,黑方马来跳。针对红方的一些走法黑方有一些固定的套路。按照套路来走局势就不会吃亏。 软件开发中有很对常见的“问题场景‘&#xff1a…

【云岚到家】-day09-1-项目迁移6-秒杀抢购介绍

【云岚到家】-day09-1-项目迁移6-秒杀抢购介绍 1 购物车1.1 交互流程1.2 Redis数据结构1.3 表设计1.4 定时同步购物车 2 签到活动2.1 需求分析2.2 系统设计2.2.1 表设计2.2.2 接口设计2.2.3 如何计算连续签到天数2.2.4 如何获取匹配签到奖励规则2.2.5 签到代码 3 秒杀抢购介绍1…

探索LINQ在C#中的应用:从基本查询到数据联接

LINQ(语言集成查询)是微软为.NET框架开发的一种强大功能,于2007年作为C# 3.0和Visual Basic .NET 9.0的一部分引入。LINQ的诞生旨在提供一种一致且直观的方式来查询和操作数据,无论数据来源是内存中的集合、数据库还是XML文档。 …

FileLink如何帮助医疗行业实现安全且高效的跨网文件交换

在当今数字化时代,医疗行业在快速发展的同时,也面临着数据安全和信息流转效率的双重挑战。患者的健康记录、影像数据、检查报告等大量敏感信息需要在不同医院、诊所、实验室和保险公司之间高效、迅速地传递。然而,传统的邮件、传真和纸质文件…

windows工具 -- 一个定时播放音乐并延迟锁屏的bat脚本(专注模式) 每隔45分钟电脑自动锁屏

目的 由于静脉曲张比较难受, 不能长时间坐着, 需要有一个强迫休息的功能: 工作45分钟45分钟到了, 自动播放音乐, 并提示30s后进行锁屏 创建bat脚本 创建一个 .txt 文本文件, 然后修改后缀名为 .bat 右键记事本打开, 复制以下代码保存 echo off :: 等待45分钟 TIMEOUT /T 2700…

opencv_相关的问题

Debug模型下运行&#xff0c;在命令行窗口会有一些error相关的log信息。 通过调整log的等级&#xff0c;屏蔽掉INFO的log信息 #include <opencv2/core/utils/logger.hpp>cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR);

深度学习-44-大模型预训练的数据预处理及大模型的分类

文章目录 1 大模型的分类1.1 按任务类型分类1.1.1 生成式模型1.1.2 判别式模型1.1.3 混合模型1.2 按数据模态分类1.2.1 单模态模型1.2.2 多模态模型1.3 按训练方法分类1.3.1 预训练模型1.3.2 从零训练模型1.3.3 迁移学习模型1.4 按应用领域分类1.4.1 自然语言处理模型1.4.2 计算…

zabbix安装基础配置

服务器准备&#xff0c;两台服务器 创建zabbix用户组&#xff0c;新增zabbix用户&#xff0c;并将zabbix用户加入zabbix用户组&#xff0c;设置zabbix用户不允许登录系统权限 [rootlocalhost ~]# groupadd zabbix [rootlocalhost ~]# useradd -g zabbix zabbix [rootlocalhost…

点云的多尺度计算

1.计算点云多尺度特征的方法 1) K近邻,然后通过VoxelGrid进行下采样。 参考文献: Timo Hackel, J. D. W., Konrad Schindler "FAST SEMANTIC SEGMENTATION OF 3D POINT CLOUDS WITH STRONGLY VARYING DENSITY." Schindler, T. H. J. D. W. K. "Contour dete…

如何将各类GIS格式数据转换为带坐标信息的CVS或EXCEL格式

介绍如何利用GIS数据转换器-矢量将各类GIS格式数据&#xff08;SHP\TAB\KML\GEOJSON\GPKG\dxf等&#xff09;转换为带坐标信息的CVS或EXCEL格式。 打开GIS数据转换器-矢量 2.选择要转换的矢量数据 3.选择要输出的格式为CSV或微软开放表格格式 4.选择输出字段 5.选择输出目录 6…

Latex之LNCS模板——Title Suppressed Due to Excessive Length

1、问题描述 使用LNCS模板时&#xff0c;文章右上角显示“Title Suppressed Due to Excessive Length”。原因&#xff1a;文章的标题太长&#xff0c;放不下。 2、解决办法 使用 \titlerunning{} 设置一个短标题。

DPI-MoCo:基于深度先验图像约束的运动补偿重建用于四维锥形束CT (4D CBCT)|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 DPI-MoCo: Deep Prior Image ConstrainedMotion Compensation Reconstruction for 4D CBCT DPI-MoCo&#xff1a;基于深度先验图像约束的运动补偿重建用于四维锥形束CT (4D CBCT) 01 文献速递介绍 安装在直线加速器上的N板锥束计算机断层扫描&#xff08;CBCT&…

6大国有银行软开的薪资待遇清单

牛客上刷到一条关于计算机专业值得去的银行软开清单,其中对 6 大国有银行软开的薪资待遇分析我觉得很有必要同步给大家看一看。 截图信息来自牛客的漫长白日梦 其中邮储软开是最值得推荐的(offer 投票没输过),二线城市转正后第一个完整年的收入在 30 万左右,一线城市更高…

深度学习之Dropout

1 Dropout 系列问题 1.1 为什么要正则化&#xff1f; 深度学习可能存在过拟合问题——高方差&#xff0c;有两个解决方法&#xff0c;一个是正则化&#xff0c;另一个是准备更多的数据&#xff0c;这是非常可靠的方法&#xff0c;但你可能无法时时刻刻准备足够多的训练数据或…