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驱动来建立的,它会在底层与数据库建立网络连接。有了网络连接才能去发送哀求给数据库服务器,如下图示:
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/6fd044903fdf4ab7bc2d7bb0a3496fef~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=qghHA6im%2BBlXPNV%2ByQ%2BVWj8cAoI%3D当Java体系和数据库有了网络连接后,Java代码才能基于这个网络连接去执行各种各样的增删改查SQL语句。如下图示:
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/8665d5ec4eda4c4080ed309f0724f274~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=FOrYoAGEZJQSLFH9RtG8BWJo5ro%3D所以MySQL会提供各种语言的MySQL驱动,让各种语言编写的体系通过MySQL驱动去访问数据库。
2.Java体系中的数据库连接池的作用
一个Java体系肯定不会只和数据库建立一个连接。因为Java体系本身会有多个线程来并发地处理多个哀求。如下图示:
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/e47be3ef8649491aa2775c6bf123b198~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=qJm1L7RrsNpmYGK1fqXrUk%2B2Jq8%3D这时如果Java体系中的多个线程并发处理多个哀求时,都要劫掠一个连接去访问数据库,那么其服从肯定是很低的。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/0481f464be3340c6923eb1c2c3196de5~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=2bSBqY80BbMdFsEjKGGOZmRwIEI%3D如果Java体系中的每个线程在每次访问数据库时,都基于MySQL驱动去创建一个自己用的数据库连接,然后执行SQL而且在执行完SQL后再销毁这个数据库连接,如许也是不可行的。
因为可能出现Java体系中上百个线程并发频仍创建和销毁数据库连接。而每次建立一个数据库连接都很耗时,从而导致哀求处理的服从很低。
所以一般会利用一个数据库连接池,在一个池子里维持多个数据库连接,让多个线程利用里面的不同的数据库连接去执行SQL语句。执行完SQL语句后,不要销毁这个数据库连接,而是把连接放回池子里,以便后续还可以继承利用。
基于如许的一个数据库连接池机制,就可解决多个线程并发创建和销毁多个数据库连接去执行SQL语句的问题。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/9ba21911054e46bebd50aa232ccc08fd~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=ofXaVm6xrznJtx7WBwBY4l9YcLg%3D常见的数据库连接池:DBCP、C3P0、Druid等。
3.MySQL中的数据库连接池作用
任何一个Java体系都应该有一个数据库连接池去访问数据库。也就是这个体系会有多个数据库连接,供多线程并发的利用;如许MySQL就需要维护与Java体系之间的连接,所以MySQL架构体系中的第一个环节,就是连接池。MySQL中的连接池就是维护与Java体系之间的多个数据库连接。
除此之外,Java体系每次跟MySQL建立连接,MySQL都会根据Java体系传递过来的账号密码进行库表权限的验证。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/3964815aacf2445b8fbb618ca66953de~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=ySchg%2F1TyL1OHZyNbGDzNCxPKbE%3D
4.网络连接必须让线程来处理
假设MySQL服务器的连接池的某个连吸收到了某条SQL语句的网络哀求。那么谁负责从这个连接中去监听网络哀求?谁把网络连接里的哀求数据读取出来?
网络连接必须得分配给一个线程去处理,由一个线程来监听哀求以及读取哀求数据。比如从网络连接中读取息争析出一条SQL语句哀求。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/b2ed1cb9a2a04c5b904123c25dc2c040~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=tDTlwRA6Gywp6EhUsueOt3W5HNI%3D
5.SQL接口会负责处理吸收到的SQL语句
当MySQL的工作线程从一个网络连接中读取出一条SQL语句后,此时会如何执行这个SQL语句呢?MySQL内部会提供一个组件,就是SQL接口。
SQL接口是一套执行SQL语句的接口,它专门用于执行Java体系发送给MySQL的增删改查SQL语句。所以MySQL的工作线程读取出SQL语句后,就会转交给SQL接口执行。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/2cdee3dda255428c9c544a7bc977020a~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=WgPKf0O6B2fcw%2BrWJ4pl7icvKEg%3D
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语句的意图。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/f71b8ac6690d473783baa2efc71297e5~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=5s07NjkwNZGLBGA55Ip284S9Teo%3D
7.查询优化器会选择最优的查询路径
当MySQL通过查询解析器理解SQL语句要干什么后,接着就会找查询优化器(Optimizer)来选择一个最优的查询路径。
查询优化器(Optimizer)会针对SQL语句天生查询路径树,然后从里面选择一条最优的查询路径出来。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/8baa00035d5d4c219e2c35c10581bfcd~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=3BwN9mPP7ixhMPHhRrw%2FrmzC5ck%3D
8.调用存储引擎接口来真正执行SQL语句
获取到查询优化器选择的最优查询路径后,即应该按照一个什么样的次序和步骤去执行这个SQL语句的计划,MySQL就会把这个计划交给底层的存储引擎去执行。
这个存储引擎是MySQL架构设计中很有特色的一个环节。对于数据库而言,数据要不就是放在内存里、要不就是放在磁盘文件里。
现在已知SQL语句会按照最优的查询路径进行执行,但MySQL怎么知道哪些数据在内存里、哪些数据在磁盘里?执行时是更新内存的数据还是更新磁盘的数据?如果更新磁盘的数据,要先查询哪一个磁盘文件,再更新哪一个磁盘文件?这些问题就需要存储引擎来解决了。
存储引擎在执行SQL语句时,会按一定的步骤进行一系列操纵。比如查询内存缓存数据、查询磁盘数据、更新磁盘数据等。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/0dcc4198410f4fd1b095d18af1e402e2~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=wFHmY3021pU87GT4w89o%2FC0EoSY%3D
9.执行器会根据执行计划调用存储引擎的接口
存储引擎可帮助MySQL去访问内存及磁盘上的数据,那么谁来调用存储引擎的接口呢?那就是执行器。
执行器会根据查询优化器选择的执行方案,去调用存储引擎的接口。执行器会按照一定的次序和步骤,去执行SQL语句的逻辑。
比如执行器首先会调用存储引擎的接口去获取"users"表中的第一行数据。然后判断一下这个数据的"id'字段的值是否等于SQL语句盼望的一个值。如果不等那就继承调用存储引擎的接口去获取"users"表的下一行数据。
基于类似思绪,执行器会根据查询优化器天生的一套执行计划,不绝地调用存储引擎的各种接口去完成SQL语句的执行计划,从而不绝地更新或者查询获取数据。
https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/9a7624a22be546c597845eef3eb3992a~tplv-obj.jpg?lk3s=ef143cfe&traceid=2024112319353133E51B49232A67BEC1AD&x-expires=2147483647&x-signature=4%2BD7ueRnLwbU5X%2F67uqcZPX5CDc%3D总结:MySQL驱动 -> 数据库连接池 -> 网络IO线程 -> SQL接口 -> 查询解析器 -> 查询优化器 -> 执行器 -> 调用存储引擎接口
SQL的执行流程:
一.由MySQL工作线程去监听网络哀求和读取网络连接的SQL数据;
二.MySQL工作线程读取出SQL语句后会转交给SQL接口去执行;
三.通过查询解析器Parser解析SQL语句让MySQL能看得懂SQL逻辑;
四.通过查询优化器Optimizer选择最优的查询路径;
五.由执行器按照查询优化器选择的执行计划不绝调用存储引擎接口;
六.存储引擎接口会查询内存缓存数据、查询磁盘数据、更新磁盘数据等;
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]