MySQL原理简介—1.SQL的执行流程

news/2025/2/26 7:23:36/文章来源:https://www.cnblogs.com/mjunz/p/18564974

大纲(2426字)

1.MySQL驱动的作用

2.Java系统中的数据库连接池的作用

3.MySQL中的数据库连接池的作用

4.网络连接必须让线程来处理

5.SQL接口会负责处理接收到的SQL语句

6.查询解析器会让MySQL读懂SQL语句

7.查询优化器会选择最优的查询路径

8.调用存储引擎接口来真正执行SQL语句

9.执行器会根据执行计划调用存储引擎的接口

 

1.MySQL驱动的作用

如果要在Java系统中访问MySQL,必须在系统依赖中加入MySQL驱动。有了MySQL驱动才能和MySQL建立连接,然后才能执行各种SQL语句。下面maven配置中就引入了一个MySQL驱动:

<dependency><groupId>MySQL</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version>
</dependency>

如果Java系统要访问数据库,首先得与数据库建立一个网络连接。那么这个连接由谁来建立呢?其实就是由MySQL驱动来建立的,它会在底层与数据库建立网络连接。有了网络连接才能去发送请求给数据库服务器,如下图示:

当Java系统和数据库有了网络连接后,Java代码才能基于这个网络连接去执行各种各样的增删改查SQL语句。如下图示:

所以MySQL会提供各种语言的MySQL驱动,让各种语言编写的系统通过MySQL驱动去访问数据库。

 

2.Java系统中的数据库连接池的作用

一个Java系统肯定不会只和数据库建立一个连接。因为Java系统本身会有多个线程来并发地处理多个请求。如下图示:

这时如果Java系统中的多个线程并发处理多个请求时,都要抢夺一个连接去访问数据库,那么其效率肯定是很低的。

如果Java系统中的每个线程在每次访问数据库时,都基于MySQL驱动去创建一个自己用的数据库连接,然后执行SQL并且在执行完SQL后再销毁这个数据库连接,这样也是不可行的。

 

因为可能出现Java系统中上百个线程并发频繁创建和销毁数据库连接。而每次建立一个数据库连接都很耗时,从而导致请求处理的效率很低。

 

所以一般会使用一个数据库连接池,在一个池子里维持多个数据库连接,让多个线程使用里面的不同的数据库连接去执行SQL语句。执行完SQL语句后,不要销毁这个数据库连接,而是把连接放回池子里,以便后续还可以继续使用。

 

基于这样的一个数据库连接池机制,就可解决多个线程并发创建和销毁多个数据库连接去执行SQL语句的问题。

常见的数据库连接池:DBCP、C3P0、Druid等。

 

3.MySQL中的数据库连接池作用

任何一个Java系统都应该有一个数据库连接池去访问数据库。也就是这个系统会有多个数据库连接,供多线程并发的使用;这样MySQL就需要维护与Java系统之间的连接,所以MySQL架构体系中的第一个环节,就是连接池。MySQL中的连接池就是维护与Java系统之间的多个数据库连接。

 

除此之外,Java系统每次跟MySQL建立连接,MySQL都会根据Java系统传递过来的账号密码进行库表权限的验证。

 

4.网络连接必须让线程来处理

假设MySQL服务器的连接池的某个连接收到了某条SQL语句的网络请求。那么谁负责从这个连接中去监听网络请求?谁把网络连接里的请求数据读取出来?

 

网络连接必须得分配给一个线程去处理,由一个线程来监听请求以及读取请求数据。比如从网络连接中读取和解析出一条SQL语句请求。

 

5.SQL接口会负责处理接收到的SQL语句

当MySQL的工作线程从一个网络连接中读取出一条SQL语句后,此时会如何执行这个SQL语句呢?MySQL内部会提供一个组件,就是SQL接口。

 

SQL接口是一套执行SQL语句的接口,它专门用于执行Java系统发送给MySQL的增删改查SQL语句。所以MySQL的工作线程读取出SQL语句后,就会转交给SQL接口执行。

 

6.查询解析器会让MySQL能读懂SQL语句

假设有这么一条SQL语句:

select id,name,age from users where id = 1;

那么查询解析器(Parser)会负责解析SQL语句,比如查询解析器(Parser)会对上面这条语句进行拆解成以下几个部分:

一.需要从"users"表里查询数据

二.查询"id"字段的值等于1的那一行数据

三.对查出来的那一行数据要提取里面的"id,name,age"三个字段

 

所谓SQL解析:就是按既定的SQL语法,对传递进来的SQL语句进行解析,然后理解该SQL语句的意图。

 

7.查询优化器会选择最优的查询路径

当MySQL通过查询解析器理解SQL语句要干什么后,接着就会找查询优化器(Optimizer)来选择一个最优的查询路径。

 

查询优化器(Optimizer)会针对SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。

 

8.调用存储引擎接口来真正执行SQL语句

获取到查询优化器选择的最优查询路径后,即应该按照一个什么样的顺序和步骤去执行这个SQL语句的计划,MySQL就会把这个计划交给底层的存储引擎去执行。

 

这个存储引擎是MySQL架构设计中很有特色的一个环节。对于数据库而言,数据要不就是放在内存里、要不就是放在磁盘文件里。

 

现在已知SQL语句会按照最优的查询路径进行执行,但MySQL怎么知道哪些数据在内存里、哪些数据在磁盘里?执行时是更新内存的数据还是更新磁盘的数据?如果更新磁盘的数据,要先查询哪一个磁盘文件,再更新哪一个磁盘文件?这些问题就需要存储引擎来解决了。

 

存储引擎在执行SQL语句时,会按一定的步骤进行一系列操作。比如查询内存缓存数据、查询磁盘数据、更新磁盘数据等。

 

9.执行器会根据执行计划调用存储引擎的接口

存储引擎可帮助MySQL去访问内存及磁盘上的数据,那么谁来调用存储引擎的接口呢?那就是执行器。

 

执行器会根据查询优化器选择的执行方案,去调用存储引擎的接口。执行器会按照一定的顺序和步骤,去执行SQL语句的逻辑。

 

比如执行器首先会调用存储引擎的接口去获取"users"表中的第一行数据。然后判断一下这个数据的"id'字段的值是否等于SQL语句期望的一个值。如果不等那就继续调用存储引擎的接口去获取"users"表的下一行数据。

 

基于类似思路,执行器会根据查询优化器生成的一套执行计划,不停地调用存储引擎的各种接口去完成SQL语句的执行计划,从而不停地更新或者查询获取数据。

总结:MySQL驱动 -> 数据库连接池 -> 网络IO线程 -> SQL接口 -> 查询解析器 -> 查询优化器 -> 执行器 -> 调用存储引擎接口

 

SQL的执行流程:

一.由MySQL工作线程去监听网络请求和读取网络连接的SQL数据;

二.MySQL工作线程读取出SQL语句后会转交给SQL接口去执行;

三.通过查询解析器Parser解析SQL语句让MySQL能看得懂SQL逻辑;

四.通过查询优化器Optimizer选择最优的查询路径;

五.由执行器按照查询优化器选择的执行计划不停调用存储引擎接口;

六.存储引擎接口会查询内存缓存数据、查询磁盘数据、更新磁盘数据等;

 

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

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

相关文章

22207203-陈思思

** Blog-2 题目集4~6的总结** 一、 前言 (一) 第4次题目集(答题判题程序4)知识点主要是类与对象、继承与多态、集合、正则表达式、业务逻辑的处理和设计模式的初步应用等。定义了多个类,每个类都进行了封装。集合方面,使用了 Map来存储问题、考试卷和学生信息,通过键值对…

2024-2025-1 20241403 《计算机基础与程序设计》第九周学习总结

2024-2025-1 20241403 《计算机基础与程序设计》第九周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第九周作业)这个作业的目标 操作系统责任 内…

OOP实验四

任务2: 源码:1 #include <iostream>2 #include <vector>3 #include <string>4 #include <algorithm>5 #include <numeric>6 #include <iomanip>7 8 using std::vector;9 using std::string;10 using std::cin;11 using std::cout;12 usi…

【淘汰9成NLP面试者的高频面题】RNN是如何基于时间进行参数学习(BPTT)的?

【淘汰9成NLP面试者的高频面题】RNN是如何基于时间进行参数学习(BPTT)的? 重要性:★★ 本【淘汰9成NLP面试者的高频面题】RNN是如何基于时间进行参数学习(BPTT)的? 重要性:★★本问题主要考察面试者有有以下几点:① 理解RNN循环的概念,认识到截断的 BPTT的必要性 ② …

标准javabean

1.javabean介绍 javabean,名为实体类,封装数据的类 前面我们写的类都是实体类,但我们写的不是标准的实体类 . 2.标准的javabean写法如图3.快捷键 一个成员变量就要写两个方法(set和get),那十个就要写20个方法,实在过于麻烦,所以我们下载一个插件,用于快速产生无参、有…

题解 - Birds

CF 2200题目 题目大意一条直线上有 \(n\) 棵树,第 \(i\) 棵树上有 \(c_i\)​ 只鸟。 在第 \(i\) 棵树下召唤一只鸟的魔力代价是 \(cost_i\)​。每召唤一只鸟,魔力上限会增加 \(B\)。每向前走一棵树,会增加 \(X\) 的魔力。一开始的魔力和魔力上限都是 \(W\)。你只能向前移动。…

压测流程

一、性能场景分析与创建压测场景业务峰值稳定性:大促业务等峰值业务稳定性考验 新系统上线:准确探知站点能力,防止系统一上线即被用户流量打垮 技术升级验证:大的技术架构升级后进行性能评估,验证新技术场景的站点性能状态 容量规划:对站点进行精细化的熔炼规划,为系统扩…

它终于发生了。2024年因人工智能倒闭的第一家美国上市企业!

一家美国公司在最近的财报发布后,股价从历史高点暴跌了99%,现在正走在倒闭的最后一段路上。 这家公司叫 Chegg,是一家美国的教育科技公司,主要提供一系列服务,帮助学生完成学业。疫情期间,它曾是备受关注的明星公司,三年前的市值一度高达 120 亿美元。 现在呢?它眼看就…

【RAG 项目实战 04】添加多轮对话能力

【RAG 项目实战 04】添加多轮对话能力 NLP Github 项目: NLP 项目实践:fast【RAG 项目实战 04】添加多轮对话能力NLP Github 项目:NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用,分享大模型算法工程师的日常…

设计模式之PIMPL模式

PIMPL是指pointer to implementation,又称作“编译防火墙”,是一种减少代码依赖和编译时间的C++编程技巧,其基本思想是将一个外部可见类的实现细节(一般是通过私有的非虚成员)放在一个单独的实现类中,在可见类中通过一个私有指针来间接访问该类型。设计模式之PIMPL模式 P…

Mac开发_制作.dmg压缩镜像文件

创建一个文件夹打开终端进入此文件夹 cd /Users/gc/Desktop/GC_Codes/打包dmg专用/Ocer_1.0.0_202411231800 使用命令生成application替身,执行以下命令 ln -s /Applications/ Applications.app文件放入文件夹打开磁盘工具:新建映像->选择基于文件夹新建映像选择这个文件…

PTA第4~6次大作业分析及总结

一、前言 ​ 本次Blog为第四~六次PTA的总结,历时三周,主要考察我们对继承的掌握情况,通过完成这几次PTA,我对java的继承的使用有了了解,这三次大作业较之前的大作业难度进一步提升,尤其是第六次大作业,由于之前生病了,我没有投入几天的精力解决这次PTA,在最后一天没能及…