浅析MySQL-基础篇01

目录

执行一条select语句,发生了什么?

MYSQL执行流程是怎么样的?

第一步:连接器

第二步:查询缓存

第三步:解析SQL

解析器

第四步:执行SQL

预处理器 

优化器

执行器


执行一条select语句,发生了什么?

学习SQL的时候,查询数据的时候简单的用到就是下面的这SQL语句:

select * from tbl_1 where id = 100;

有没有想过,MYSQL执行一条select查询语句,在MYSQL中期间发生了什么?

带着这个问题,我们可以很好的理解MYSQL内部的架构,下面我们具体看看内部的流程。

MYSQL执行流程是怎么样的?

下面就是 MySQL 执行一条 SQL 查询语句的流程,也从图中可以看到 MySQL 内部架构里的各个功能模块

MySQL 的架构共分为两层:Server 层和存储引擎层

  • Server层负责建立连接、分析和执行SQL
  • 存储引擎负责数据的存储和求提取

第一步:连接器

如果你要使用MySQL,那么第一步是要先连接数据库服务,然后才能才能执行SQL语句。

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

连接的过程需要先经过TCP三次握手,因为MySQL是基于TCP协议进行传输。

 如何查看MySQL服务当前有多少个客户端连接?

可以执行执行下面的SQL命令进行查看

show processlist

上图结果:有两个用户名为root的用户连接了MYSQL服务,其中id为42的用户的Command状态为Sleep,这意味着该用户连接完MSQL服务就没有执行过任何命令,也就是个空闲的连接,空闲时长是81秒

 空闲连接会一直占用吗?

不会,MySQL定义了空闲连接的最大空闲时长,由wait_timeout参数控制,默认值是28800秒(8小时),如果空闲连接超过了这个时间,连接器就会自动将它断开。

当然,我们也可以手动断开空闲连接,使用kill connection + id 命令

 一个处于空闲状态的连接被服务端主动断开后,这个客户端并不会马上知道,等到客户端再发起下一个请求的时候,才会收到"Lost connection"

 MySQL的连接数有限制吗?

MySQL服务支持的最大连接数由max_connections参数控制。默认值是151个,超过这个值,系统就会拒绝接下来的连接请求,并提示报错“Too many connections”。

MySQL的连接也有长连接和短连接的概念,区别如下:

// 短连接
连接 mysql 服务 (TCP 三次握手)
执行sql
断开 mysql 服务 (TCP 四次挥手)// 长连接
连接 mysql 服务 (TCP 三次握手)
执行sql
执行sql
执行sql
...
断开 mysql 服务 (TCP 四次挥手)

可以发现,使用长连接的好处就是可以减少建立连接和断开连接的过程,所以一般推荐使用长连接。

但是长连接后可能会占用内存增多,因为MySQL执行查询过程中临时使用内存管理连接对象,这些连接对象资源只有在连接断开时才会释放。如果长连接累计很多,将导致MySQL服务占用内存太大,有可能会被系统强制杀掉,这样会发生MySQL服务异常重启的现象。

怎么解决长连接占用内存的问题? 

两种解决方式:

  • 定期断开长连接
  • 客户端主动重置连接。5.7版本实现了mysql_reset_connection() 函数的接口,注意这个事接口函数不是命令,那么客户端执行了一个很大的操作后,在代码里调用此函数来重置连接,达到释放内存的效果。这个过程不需要重连和重新做权限验证,但是会将恢复到刚刚创建完时的状态

数据库连接池简单的实现方式:

GitHub - maokeyang/SimpleDataSourcePool

至此,连接器的工作做完了,简单的总结一下:

  •  与客户端发起TCP三次握手建立连接
  • 校验客户端的用户名和密码
  • 如果校验通过,会读取用户的权限,然后后面的权限逻辑判断都会基于此时读到的权限

第二步:查询缓存

连接器的工作完成以后,客户端可以向MySQL服务发送SQL语句,服务端收到SQL语句后,就会解析SQL语句第一个字段,分析是什么类型的语句

如果SQL语句是查询select语句,MySQL就会先去缓存里查询找数据,看看之前有没有执行过这一条命令。这个缓存是以key-value方式保存在内存中,key为SQL查询语句,value是SQL语句的查询结果。

其实缓存比较鸡肋。

对于更新比较频繁的表,查询缓存的命中率很低。因为只要表有一个更新操作,那么这个表的查询缓存就会被清空。如果刚缓存了一个查询结果很大的数据,还没被使用的时候,刚好这个表触发了更新操作,那么查询缓存就会被清空,相当于干了个寂寞。所以MySQL8.0版本中直接将查询缓存删掉了,也就是说从8.0版本开始,执行一条SQL查询语句,不会再走查询缓存这个阶段了。

第三步:解析SQL

 执行SQL之前,MySQL会先对SQL语句解析,这个工作交给「解析器」来处理

解析器

第一步:词法分析

关键字非关键字关键字非关键字
selectname

from

tbl_1

第二步:语法分析

如果我们输入的 SQL 语句语法不对,就会在解析器这个阶段报错。比如,我下面这条查询语句,把 from 写成了 form,这时 MySQL 解析器就会给报错。 

第四步:执行SQL

经过解析器后,接着就要进入执行SQL查询语句的流程,每条select查询语句流程主要可以分为下面三个阶段

  • prepare阶段  -> 预处理阶段
  • optimize阶段 -> 优化阶段
  • execute阶段  -> 执行阶段
预处理器 

预处理都做了什么事情呢?

  • 检查SQL查询语句中的表或者字段是否存在
  • 将select * 中的*符号,扩展为表上的所有列
优化器

经过预处理阶段后,还需要为SQL查询语句先制定一个执行计划,这个工作是由「优化器」完成的。

优化器主要负责将SQL查询语句的执行方案确定下来,比如表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引

执行器

经历完优化器后,就确定了执行方案,接下来就真正开始执行语句了 ,这个工作是由「执行器」完成的。在执行的过程中,执行器就会和存储引擎交互了,交互是以记录为单位的。

以下以三种方式描述执行过程

  • 主键索引查询
  • 全表扫描
  • 索引下推

索引下推是MySQL5.6推出的查询优化策略,索引下推能够减少二级索引在查询时的回表操作,提高查询的效率,因为它将Server层部分负责的事情,交给存储引擎层去处理了。

下面以一个例子说明:

CREATE TABLE `tbl_score` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(30) NOT NULL comment '名字',`age` int NOT NULL comment '年龄',`score` int NOT NULL comment  '分数',PRIMARY KEY (`id`),KEY `index_age_score` (`age`,`score`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

下面这条查询语句:

select * from tbl_score  where age < 18 and score = 80;

联合索引当遇到范围查询就会停止匹配,也就是age字段能用到联合索引,但是score字段则无法利用到索引。

无索引下推(5.6版本之前)时,执行器与存储引擎的执行流程会如下:

  • Server层首先调用存储引擎的接口定位到满足条件的第一条二级索引记录,也就是定位到age<18的第一条记录;
  • 存储引擎根据二级索引的B+树快速定位到这条记录后,获取主键值,然后进行回表操作,将完整的记录返回给Server层;
  • Server层在判断该记录的score是否等于80,如果成立则将其发送给客户端;否则跳过该记录;
  • 接着,继续向存储引擎索要下一条记录,存储引擎在二级索引定位到记录后,获取主键值,然后回表操作,将完整的记录返回给 Server 层;
  • 如此往复,直到存储引擎把表中的所有记录读完。

可以看到,没有索引下推的时候,每查询到一条二级索引记录,都要进行回表操作,然后将记录返回给 Server,接着 Server 再判断该记录的 score 是否等于80。

使用索引下推时,执行器与存储引擎的执行流程:

  • Server层首先调用存储引擎的接口定位到满足条件的第一条二级索引记录,也就是定位到age<18的第一条记录;
  • 存储引擎定位到二级索引后,先不执行回表操作,而是先判断一下该索引中包含的列(score列)的条件(score 是否等于 80)是否成立。如果条件不成立,则直接跳过该二级索引。如果成立,则执行回表操作,将完成记录返回给 Server 层。
  • Server 层在判断其他的查询条件(本次查询没有其他条件)是否成立,如果成立则将其发送给客户端;否则跳过该记录,然后向存储引擎索要下一条记录。
  • 如此往复,直到存储引擎把表中的所有记录读完。

可以看到,使用了索引下推后,虽然 score 列无法使用到联合索引,但是因为它包含在联合索引(age,score)里,所以直接在存储引擎过滤出满足 score = 80 的记录后,才去执行回表操作获取整个记录。相比于没有使用索引下推,节省了很多回表操作。

如果发现执行计划里的 Extr 部分显示了 “Using index condition”,说明使用了索引下推。

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

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

相关文章

hive on spark 记录

环境&#xff1a; hadoop 2.7.2 spark-without-hadoop 2.4.6 hive 2.3.4 hive-site.xml <property><name>hive.execution.engine</name><value>spark</value> </property> <property><name>spark.yarn.jars</name>&l…

【git1】指令,commit,免密

文章目录 1.常用指令&#xff1a;git branch查看本地分支&#xff0c; -r查看远程分支&#xff0c; -a查看本地和远程&#xff0c;-v查看各分支最后一次提交, -D删除分支2.commit规范&#xff1a;git commit进入vi界面&#xff08;进入前要git config core.editor vim设一下vi模…

不用写一行代码,deepseek结合腾讯云语音识别来批量转录Mp3音频

首先&#xff0c;打开window系统中的cmd命令行工具&#xff0c;或者powershell&#xff0c;安装腾讯云tencentcloud的Python库 pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python 然后&#xff0c;开通腾讯云的对象存储COS服务&…

超级好用的JSON格式化可视化在线工具

JSON是开发非常常用的一种报文格式&#xff0c;最常见的需求就是将JSON进行格式化&#xff0c;最好是有图形化界面显示结构关系&#xff0c;以便进行数据分析。 理想的在线JSON工具&#xff0c;应该支持快速格式化、可压缩、快捷复制、可下载导出&#xff0c;对存在语法错误的地…

计算机组成原理 —— 存储系统(DRAM和SRAM,ROM)

计算机组成原理 —— 存储系统&#xff08;DRAM和SRAM&#xff09; DRAM和SRAMDRAM的刷新DRAM地址复用ROM&#xff08;Read-Only Memory&#xff08;只读存储器&#xff09;&#xff09; 我们今天来看DRAM和SRAM&#xff1a; DRAM和SRAM DRAM&#xff08;动态随机存取存储器&…

【ajax基础】回调函数地狱

一&#xff1a;什么是回调函数地狱 在一个回调函数中嵌套另一个回调函数&#xff08;甚至一直嵌套下去&#xff09;&#xff0c;形成回调函数地狱 回调函数地狱存在问题&#xff1a; 可读性差异常捕获严重耦合性严重 // 1. 获取默认第一个省份的名字axios({url: http://hmaj…

具有 Hudi、MinIO 和 HMS 的现代数据湖

Apache Hudi 已成为管理现代数据湖的领先开放表格式之一&#xff0c;直接在现代数据湖中提供核心仓库和数据库功能。这在很大程度上要归功于 Hudi 提供了表、事务、更新/删除、高级索引、流式摄取服务、数据聚类/压缩优化和并发控制等高级功能。 我们已经探讨了 MinIO 和 Hudi…

【Python】从0开始的Django基础

Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…

android 在线程中更新界面

在Android中&#xff0c;你不能直接从子线程中更新UI&#xff0c;因为这会导致应用崩溃。你需要使用Handler或runOnUiThread()来更新UI。 使用Handler 以下是如何使用Handler在子线程中更新UI的示例&#xff1a; 1. 创建Handler实例&#xff1a; import android.os.Bundle;…

docker搭建mongo副本集

1、mongo集群分类 MongoDB集群有4种类型&#xff0c;分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中&#xff0c;一个节点&#xff08;主节点&#xff09;将数据写入并同步到其他节点&#xff08;从节点&#xff09;。主从复制提供…

数据可视化实验一:Panda数据处理及matplotlib绘图初步

目录​​​​​​​ 2024-6-17 一、请将所有含有发明家“吴峰”的发明专利的“申请日”打印出来。并将含有“吴峰”的所有发明专利条目保存到Excel中 1.1 代码实现 1.2 运行结果 二、读取文件创建城市、人口、性别比、城镇化率DataFrame对象&#xff0c;计算指标排名&…

【iOS】#include、#import、@class、@import

文章目录 #include#importclassimport总结 #include #include是c\c中的预处理器指令&#xff0c;用于包含头文件的内容 但是使用#include可能会出现重复包含文件的问题&#xff0c;因此需要使用&#xff08;#ifndef/#define/#endif&#xff09;。 #import //导入系统头文件…

学习C++第二天

1.缺省参数 缺省参数的概念&#xff1a; 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void show(int a 10) {cout << a << endl; }int main() {sho…

FPGA学习网站推荐

FPGA学习网站推荐 本文首发于公众号&#xff1a;FPGA开源工坊 引言 FPGA的学习主要分为以下两部分 语法领域内知识 做FPGA开发肯定要首先去学习相应的编程语言&#xff0c;FPGA开发目前在国内采用最多的就是使用Verilog做开发&#xff0c;其次还有一些遗留下来的项目会采用…

构建未来应用的核心,云原生技术栈解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、云原生技术栈 1、容器和容器编排 1.1 Docker 1.2 Kubernete…

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址&#xff1a;node.js…

电子杂志制作的必备软件:轻松提升制作效率

​电子杂志作为一种新型的媒体形式&#xff0c;具有互动性强、内容丰富、传播范围广等特点。随着互联网的普及&#xff0c;越来越多的企业和个人开始关注和投入电子杂志的制作。然而&#xff0c;电子杂志的制作过程往往复杂繁琐&#xff0c;需要付出大量的时间和精力。为了提高…

macbook配置adb环境和用adb操作安卓手机

&#xff08;参考&#xff1a;ADB工具包的安装与使用_adb工具箱-CSDN博客&#xff09; 第一步&#xff1a;从Android开发者网站下载Android SDK&#xff08;软件开发工具包&#xff09;。下载地址为&#xff1a; 第二步&#xff1a;解压下载的SDK压缩文件到某个目录中。 进入解…

【Python机器学习实战】 | 基于线性回归以及支持向量机对汽车MPG与自重进行回归预测

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…