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 ...
随机推荐
- C# 导出Excel NPOI 修改指定单元格的样式 或者行样式
参考文章:原文链接:https://blog.csdn.net/chensirbbk/article/details/52189985 #region 2.NPOI读取Excel 验证Excel数据的 ...
- 在 macOS 上安装 fish
安装 fish brew install zsh 将默认 shell 切换为 fish 由于 Homebrew 安装的 fish 不在标准 shell 列表 /etc/shell 里,因此要先将 fi ...
- vue3+ts Axios封装与使用
创建完vue3 项目后 新版本:动态控制是否显示加载动画.是否需要判断重复请求.https://www.cnblogs.com/lovejielive/p/17676856.html 一,安装Axio ...
- spark 自定义 accumulator
默认的accumulator 只是最简单的 int/float 有时候我需要一个map来作为accumulator 这样,就可以处理 <string, int>类型的计数了. 此外我还需要 ...
- 五子棋AI:实现逻辑与相关背景探讨(上)
绪论 本合集将详细讲述如何实现基于群只能遗传算法的五子棋AI,采用C++作为底层编程语言 本篇将简要讨论实现思路,并在后续的文中逐一展开 了解五子棋 五子棋规则 五子棋是一种经典的棋类游戏,规则简单却 ...
- 给vue+element-ui动态设置主题色(包括外链样式、内联样式、行内样式)
基本思路 实现思路:实现一个mixins混入的主题js即theme.js,注册到全局下.使用el-color-picker组件切换颜色的时候,把颜色值传递到根root下,在根实例下监听主题色的变化来更 ...
- CSS – min(), max(), clamp()
介绍 它们类似 calc(). 用来通过 formula 输出一个值. 用于 font-size, width, height 之类的, 这些地方. 非常适合用来做 RWD 哦 (特别是 font-s ...
- ASP.NET Core – Custom Input formatters For Partial Update and Handle Under-posting
前言 之前的文章有谈过关于 ASP.NET Core 处理 under-posting 的方式. 它会使用 class default value. 许多时候这可能不是我们期望的. 比如当我们想要 p ...
- 【linux】【docker】Docker默认网段配置导致无法访问
背景 集团有N个基地,所有基地的网络使用的是172.x.x.x网段,这本身没有什么问题!但Docker默认的桥接网段也是172.17.x.x的,如果不修改docker的默认配置会导致个别基地无法访问! ...
- 图解YUV420、YUV420(YUY2)、YUV422(YVYU)
Y:亮度分量 UV:色度分量 1. 标准yuv指的是yuv420 一般看文章,会出现下面的公式,但不涉及具体的yuv格式,其实这一定指的是yuv420 Y与RGB的演算关系为:Y = 0.21 ...