MySQL原理简介—1.SQL的执行流程
大纲(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选择最优的查询路径;
五.由执行器按照查询优化器选择的执行计划不停调用存储引擎接口;
六.存储引擎接口会查询内存缓存数据、查询磁盘数据、更新磁盘数据等;
MySQL原理简介—1.SQL的执行流程的更多相关文章
- MySql基础架构以及SQL语句执行流程
01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password ...
- 3、myql的逻辑架构和sql的执行流程
msyql逻辑架构 逻辑架构的解析 逻辑架构图如下(序号代表的是:服务器处理客户端请求的流程) 1.1connectors connectors是指使用不同语言的客户端与mysql server服务器 ...
- Spark SQL底层执行流程详解
本文目录 一.Apache Spark 二.Spark SQL发展历程 三.Spark SQL底层执行原理 四.Catalyst 的两大优化 一.Apache Spark Apache Spark是用 ...
- 一条查询sql的执行流程和底层原理
1.一条查询SQL执行流程图 2.查询SQL执行流程之发送SQL请求 (1)客户端按照Mysql通信协议将SQL发送到服务端,SQL到达服务端后,服务端会单起一个线程执行SQL. (2)执行时Mysq ...
- MySQL基础架构之查询语句执行流程
这篇笔记主要记录mysql的基础架构,一条查询语句是如何执行的. 比如,在我们从student表中查询一个id=2的信息 select * from student where id=2; 在解释这条 ...
- 【原创】3. MYSQL++ Query类型与SQL语句执行过程(非template与SSQLS版本)
我们可以通过使用mysqlpp:: Query来进行SQL语句的增删改查. 首先来看一下mysqlpp::Query的一些最简单的调用, conn.connect(mysqlpp::examples: ...
- MySQL 中一条 sql 的执行过程
一条 SQL 的执行过程 前言 查询 查询缓存 分析器 优化器 执行器 数据更新 日志模块 redo log (重做日志) binlog (归档日志) undo log (回滚日志) 两阶段提交 为什 ...
- Kafka简介、基本原理、执行流程与使用场景
一.简介 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Linkedin于201 ...
- sql的执行流程
mysql中的SQL语句执行是有一定顺序的,如下:1. from2. on3. join4. where5. group by6. with7. having8. select9. distinct1 ...
- 面试官:说说一条查询sql的执行流程和底层原理?
一条查询SQL执行流程图如下 序章 自我介绍 我是一条sql,就是一条长长的字符串,不要问我长什么样,因为我比较傲娇. 额~~不是我不说啊,因为细说起来,我可以细分为DML(Update.Insert ...
随机推荐
- LaTeX 生成黑底白字的 PDF
最近需要深夜看论文,然而白底的 PDF 看久了眼睛很难受,想转换成黑底的.正好我有论文的 LaTeX 源码,因此可以直接编译黑底的 PDF 出来. 使用 darkmode 宏包 CTAN 上有一个 L ...
- Seata 1.3.0 ERROR i.s.c.r.n.NettyClientChannelManager -no available service 'null' found, please make sure registry config correct
根据个人经验,报这个错误是因为nacos里并没有同步seata的config导致的 配置文档:https://www.bookstack.cn/read/seata-1.3.0/4b2f4de4831 ...
- springboot 前端访问服务器上的图片及附件
一.需求 后端是springboot,附件上传到服务器上,前端访问服务器上的附件,如:显示图片.视频.文件等 二.解决方法 springboot 中进行资源映射,根据路径将磁盘上的文件映射为资源返回到 ...
- 自己服务器搭建docker组和环境
1. docker 当然首先安装一下docker,具体怎么 安装,网上搜一下.我用的ubuntu20系统,就是安装一个普通的软件的操作.安装后,运行一下docker run hello-world,运 ...
- UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化
微软(9 月 11 日)发布博文,微软正在预览对 .NET 9 的 UWP(通用 Windows 平台)支持,为现有 UWP 开发人员提供一条使用最新的 .NET 和本机 AOT 实现其应用程序现代化 ...
- MyBatisPlus——DML编程控制——乐观锁
乐观锁 业务并发现象带来的问题:秒杀最后一单 用于中小型项目(2000请求以下) 添加一个数据库字段,使每次请求修改数据时,这个字段就加一,当有多人同时请求时,这些人同时获取到的都是相同的该字段,但当 ...
- JSP——简介-快速入门
JSP 简介 JSP 快速入门 <%@ page contentType="text/html;charset=UTF-8" language=&qu ...
- dfs 验证搜索二叉树——leetcode98
代码来自leetcode官方 一开始我自己写这个代码时只注意当前节点是否会存在空指针,并没有注意到他的孩子节点也有可能为空,绕了我好久...... /** * Definition for a bin ...
- 10月《中国数据库行业分析报告》已发布,深度剖析甲骨文大会Oracle技术新趋势
为了帮助大家及时了解中国数据库行业发展现状.梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析研究团队出品将持续每月为大家推出最新<中国数据库行业分析报告>,持 ...
- .Net 中带有 ? 的运算符
// 带 ? 的表达式 // 1. 三元表达式 // 2. ?? 双问号 // obj1 ?? obj2 如果 obj1 为 空(null) 返回 obj2 // Configure the HTTP ...