本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎摸光芒闪烁,sql语句的更新是怎么成功的。
在总结之前我会先跟着你看一下mysql的基础架构,清楚了mysql由那些组件混编已经这些组件的作用是什么,可以不帮我们表述和可以解决这些问题。
一mysql基础架构分析1.1mysql基本架构概览
下图是mysql的一个作分析架构图,从下图你可以很清晰的注意到用户的sql语句在mysql内部是要如何执行的。
先很简单推荐一下下图比较复杂的一些组件的基本上作用好处大家表述这幅图,在1.2节中会祥细详细介绍到这些组件的作用。
连接器:身份认证和权限具体(登陆mysql的时候)。网上查询缓存:执行查询语句的时候,会先去查询缓存(mysql8.0版本后移除,只不过这个功能不太实惠)。分析器:就没物理命中缓存的话,sql语句是会经由分析器,分析器说白了应该是要先看你的sql语句要干什么,再检查一下你的sql语句语法是否正确。360优化器:听从mysql其实最优的方案去先执行。执行器:执行语句,后再从存储引擎前往数据。
简单来说mysql要注意两类server层和存储引擎层:
server层:通常包括连接器、可以查询缓存、分析器、360优化器、执行器等,所有跨存储引擎的功能都在这一层利用,例如存储过程、触发器、视图,函数等,有一个可以修的日志模块binglog日志模块。存储引擎:比较多你们负责数据的存储和读取文件,需要可以修改成的插件式架构,支持innodb、myisam、memory等多个存储引擎,其中innodb引擎有自有的日志模块redolog模块。现在最常用的存储引擎是innodb,它从mysql5.5.5版本结束就被当做设置存储引擎了。1.2server层都差不多组件介绍
1)连接器
连接器要注意和身份认证和权限相关的功能去相关,就再则一个级别很高的门卫差不多。
主要注意负责用户登录数据库,并且用户的身份认证,除开校验账户密码,权限等操作,如果用户账户密码已是从,连接器会到权限表中网上查询该用户的所有权限,之后在这个连接里的权限逻辑判断全是会依赖感此时读取文件到的权限数据,也就是说,强盗团如果这个再连接断的开,立即管理员可以修改了该用户的权限,该用户都是不受影响的。
2)查询缓存(mysql8.0版本后移除)
网站查询缓存比较多用来缓存我们所负责执行的select语句以及该语句的结果集。
直接连接确立后,执行查询语句的时候,会先可以查询缓存,mysql会先校验这个sql是否是先执行过,以key-value的形式缓存在内存中,key是网上查询最迟,value是结果集。要是缓存key被暴击命中,变会真接赶往给客户端,要是是没有命中等级,是会不能执行强盗团的操作,完成后也会把结果缓存过来,更方便下第二次动态链接库。其实在能够想执行缓存去查询的时候应该会校验用户的权限,如何确定有该表的查询条件。
mysql可以查询不个人建议不使用缓存,是因为查询缓存终止在换算业务场景中可能会会更加正常,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。对于不你经常更新的数据来说,使用缓存那就可以不的。
所以我,像是在大多数情况下我们都是不推荐推荐去使用查询缓存的。
mysql8.0版本后删除了缓存的功能,官方也怀疑该功能在换算的应用场景比较好少,因为乾脆真接删除掉了。
3)分析器
mysql没有命中缓存,这样的话就会直接进入分析什么器,分析器主要是用处讲sql语句是来干什么啊的,分析器也会两类几步:
最先,词法分析,一条sql语句有多个字符串混编,首先要分离提取关键字,比如tablename,提出去查询的表,提出来字段名,做出查询条件等等。完了以后这些操作后,就会再次进入第二步。
第二步,语法分析,主要就是可以确定你然后输入的sql是否错误的,是否需要要什么mysql的语法。
能完成这2步之后,mysql就准备着就开始先执行了,不过要如何执行,怎末执行是最好的结果呢?而现在就要优化系统器替补队员了。
4)优化器
360优化器的作用那就是它怀疑的最优化的执行方案去想执行(有时很可能也不是什么最优,这篇文章涉及对这部分知识的深入解说),比如多个索引的时候该要如何你选索引,多表可以查询的时候怎么中,选择关联顺序等。
无疑,经由了优化软件器之后可以说这个语句具体该如何能想执行就巳经定下去。
5)执行器
当选择了执行方案后,mysql就准备好结束执行了,必须先执行前会校验该用户有没有权限,如果不是没有权限,可能会前往错误`信息,假如有权限,是会去内部函数引擎的接口,直接返回接口想执行的结果。
二语句讲2.1查询语句
说了以上这么大多,这样也不知一条sql语句是如何不能执行的呢?其实我们的sql是可以统称两种,一种是去查询,一种是更新(减少,更新,删除)。我们先讲下查询语句,语句追加:
select*returningtb_studentawherebut张三
增强上面的说明,我们总结下这个语句的执行流程:
先检查该语句是否是有权限,要是没有权限,然后直接返回错误`信息,假如有权限,在mysql8.0版本以前,会先可以查询缓存,以这条sql语句为key在内存中网上查询是否有结果,假如有再缓存,假如没有,想执行第二步。分析器参与词法讲,分离提取sql语句的重要元素,诸如提纯上面这个语句是去查询select,再提取必须去查询的表名为tb_student,不需要网站查询所有的列,网站查询条件是这个表的id1。然后把确认这个sql语句是否需要有语法错误,.例如关键词如何确定错误的等等,如果没有检查绝对没问题就执行接下来。这一次就是系统优化器并且判断不能执行方案,上面的sql语句,可以不有两种执行方案:
a.先可以查询学生表中姓名为“张三”的学生,后再确定是否年龄是18。b.先找出学生中年龄18岁的学生,然后把再可以查询姓名为“张三”的学生。
那么优化系统器依据自己的优化算法进行你选先执行效率最好就是的一个方案(优化软件器以为,有时候不肯定会最好就是)。那你去确认了负责执行计划后就准备着开始先执行了。
参与权限校验,假如没有权限都会返回错误信息,如果有权限变会调用数据库引擎接口,直接返回引擎的执行结果。
2.2没更新语句
以上应该是一条查询sql的执行流程,那你这一次我们看下一条没更新语句该如何想执行的呢?sql语句::
updatetb_studentasetwhere张三
我们来给张三如何修改下年龄,在求实际数据库估计应该不会设置中年龄这个字段的,要不要被技术负责人打的。反正条语句也基本是会沿着上三个网站查询的流程走,不过负责执行更新完的时候当然要记录日志啦,这都会分解重组日志模块了,mysql随机软件的日志模块式binlog(归档日志),所有的存储引擎都也可以不使用,我们常用的innodb引擎还随机软件了一个日志模块redolog(重做一次日志),我们就以innodb模式下去继续探讨这个语句的执行流程。流程::
先可以查询到张三这一条数据,如果有缓存,都是会都用到缓存。然后再拿到去查询的语句,把age中改19,然后把动态创建引擎api接口,写入到这一行数据,innodb引擎把数据保存在内存中,同样资料记录redolog,此时redolog直接进入prepare状态,然后把提醒执行器,执行完成了,时刻这个可以递交。执行器发来通知后记录binlog,接着内部函数引擎接口,再提交redolog为递交状态。更新能完成。这里肯定有同学会问,为什么要用两个日志模块,用一个日志模块再不行吗?
这是是因为最开始mysql并没与innodb引擎(innodb引擎是其他公司以插件形式插入mysql的),mysql从网上下载的引擎是myisam,可是我们清楚redolog是innodb引擎浓重的,其他存储引擎都还没有,这就可能导致会是没有fault-safe的能力(attack-safe的能力况且数据库再一次发生极其重新启动,前递交的记录都肯定不会全部丢失),binlog日志只有用处归档。
并不是什么说只用一个日志模块好像不行,只不过innodb引擎应该是通过redolog来接受事务的。这样的话,又会有同学问,我用两个日志模块,不过不要这么急切行不行的话,为什么redolog要核心中prepare预再提交状态?这里我们用反证法来那就证明下为甚么?
先写redolog真接并提交,然后写binlog,举例开始写redolog后,机器挂了,binlog日志还没有被写入到,那你机器重新启动后,这台机器会实际redolog复原数据,可是这时候bingog并没有留下记录该数据,现并且机器备分的时候,是会丢失的这一条数据,同样的主从同步也会丢了这一条数据。先写binlog,然后把写redolog,假设不成立没写完了binlog,机器异样重启后了,导致没有redolog,本机是不能复原这一条记录的,不过binlog又有记录,这样和上面同样的道理,都会再产生数据不相符的情况。如果没有按结构redolog两阶段提交的就不差不多了,写了一半binglog后,后再再重新提交redolog可能会以免出现根据上述规定的问题,进而能保证了数据的一致性。那么今天来聊一聊,有没有一个走极端的情况呢?假设不成立redolog在预递交状态,binglog也已经没写完了,而现在突然发生了极其重新启动会咋样呢?这个就要依恋于mysql的处理机制了,mysql的处理过程追加:
确认redolog有无完整,要是可以确定是完整的,就立刻重新提交。要是redolog只是预并提交但不是commit状态,这会儿就会去确认binlog有无求下载,假如完整就提交redolog,不完整就自动回滚事务。这样的就可以解决了数据一致性的问题。
三总结mysql比较多可分server曾和引擎层,server层要注意和连接器、可以查询缓存、分析器、系统优化器、执行器,而有一个日志模块(binlog),这个日志模块所有执行引擎都也可以共用,redolog唯有innodb有。引擎层是插件式的,目前主要和,myisam,innodb,memory等。查询语句的执行流程::权限校验(如果没有暴击命中缓存)---》查询缓存---》结论器---》优化系统器---》权限校验---》执行器---》引擎更新语句执行流程万分感谢:总结器----》权限校验----》执行器---》引擎---redolog(prepare状态---》binlog---》redolog(commit状态)
差不多的基本是流程::
直接连接数据库,再加一个判断。
选择数据库
加载表
输出低表中数据
下面是代码:
$conmysql_connect(