2016 - 2024

感恩一路有你

mysql主从复制的原理以及大致流程 mysql:一条SQL查询语句是如何执行的?

浏览量:3689 时间:2023-05-24 22:46:44 作者:采采

mysql:一条SQL查询语句是如何执行的?

本篇文章会分析下一个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层:通常和连接器、去查询缓存、分析器、优化软件器、执行器等,所有跨存储引擎的功能都在这一层实现方法,比如说存储过程、触发器、视图,函数等,有一个没限制的日志模块binglog日志模块。存储引擎:主要注意专门负责数据的存储和加载,需要是可以替换的插件式架构,允许InnoDB、MyISAM、Memory等多个存储引擎,其中InnoDB引擎有自有的日志模块redolog模块。现在最常用的存储引擎是InnoDB,它从MySQL5.5.5版本就开始就被只不过是设置存储引擎了。1.2Server层都差不多组件介绍

1)连接器

连接器比较多和身份认证和权限相关的功能相关,就是说一个级别很高的门卫一般。

要注意负责用户登录数据库,进行用户的身份认证,以及校验账户密码,权限等你的操作,假如用户账户密码已按照,连接器会到权限表中网站查询该用户的所有权限,之后在这个连接里的权限逻辑判断也是会依恋此时读取文件到的权限数据,也就是说,现只需这个直接连接不断开,迅速管理员直接修改了该用户的权限,该用户都是不受影响的。

2)查询缓存(MySQL8.0版本后移除)

查询缓存通常用来缓存我们所负责执行的SELECT语句在内该语句的结果集。

连接建立后,不能执行查询语句的时候,会先网站查询缓存,MySQL会先校准这个sql如何确定执行过,以Key-Value的形式缓存在内存中,Key是网站查询预计2020年,Value是结果集。假如缓存key被暴击命中,是会就回给客户端,要是就没命中,可能会执行妖军的操作,完成后也会把结果缓存下来,比较方便下四次调用。当然了在唯一先执行缓存网上查询的时候那就会校验用户的权限,是否是有该表的查询条件。

MySQL可以查询不个人建议使用缓存,而且查询缓存无法激活在实际业务场景中可能会非常正常,要是你对一个表更新完的话,这个表上的所有的查询缓存都会被删掉。对于不你经常更新完的数据来说,使用缓存还是也可以的。

因为,好象在大多数情况下我们大都不推荐去可以使用去查询缓存的。

MySQL8.0版本后删除了缓存的功能,官方也是以为该功能在换算的应用场景比较比较少,因此索性直接删除了。

3)分析器

MySQL就没暴击命中缓存,那么变会再次进入分析器,分析器通常是单独分析什么SQL语句是来干什么的,分析器也会分为几步:

不过在此之前,词法分析,一条SQL语句有多个字符串混编,首先要提纯关键字,诸如column,提出去查询的表,提出字段名,提出来查询条件等等。做完了这些操作后,都会再次进入第二步。

第二步,语法分析,比较多那就是确认你输入输入的sql是否真确,是否是要什么MySQL的语法。

完成这2步之后,MySQL就准备就开始负责执行了,不过怎么不能执行,怎么执行是好是的结果呢?这时候就需要优化系统器上场比赛了。

4)优化器

优化系统器的作用那是它以为的更优的执行方案去想执行(总是很可能也又不是最优,这篇文章牵涉到对这部分知识的深入讲解),诸如多个索引的时候该如何中,选择索引,多表网站查询的时候如何中,选择关联顺序等。

的确,当经过了系统优化器之后也算这个语句详细该如何先执行就早定下了。

5)执行器

当你选择了执行方案后,MySQL就准备着又开始想执行了,简单的方法不能执行前会校验该用户有没有权限,假如没有权限,变会回出现了错误信息,如果没有有权限,变会去动态链接库引擎的接口,直接返回接口先执行的结果。

二语句讲2.1查询语句

说了以上这样多,那么也不知一条sql语句是该如何执行的呢?其实我们的sql这个可以分成三类两种,一种是去查询,一种是可以更新(提升,没更新,彻底删除)。我们先总结下查询语句,语句万分感谢:

select*acrosstb_studentAwherebecause张三

增强上面的说明,我们分析下这个语句的执行流程:

先全面检查该语句有无有权限,要是没有权限,就前往错误信息,如果没有有权限,在MySQL8.0版本以前,会先去查询缓存,以这条sql语句为key在内存中网上查询是否是有结果,假如有真接缓存,要是没有,负责执行然后再。是从分析器参与词法分析什么,提纯sql语句的关键元素,比如说分离提取上面这个语句是查询select,分离提取必须可以查询的表名为tb_student,要网站查询所有的列,可以查询条件是这个表的id1。然后再可以确定这个sql语句如何确定有语法错误,诸如关键词是否需要正确的等等,如果检查没问题就执行第二步。接下来的就是优化器参与判断执行方案,上面的sql语句,也可以有两种想执行方案:

a.先去查询学生表中姓名为“张三”的学生,后再确定是否年龄是18。b.先找到什么学生中年龄18岁的学生,然后再再网上查询姓名为“张三”的学生。

那就优化软件器参照自己的优化算法并且中,选择想执行效率最好的一个方案(系统优化器以为,有时不是有建议)。那你确定了先执行计划后就马上准备就开始想执行了。

进行权限校验,假如没有权限可能会回出错信息,假如有权限可能会调用数据库引擎接口,前往引擎的执行结果。

2.2没更新语句

以上是一条查询sql的执行流程,这样接下来我们看看一条自动更新语句要如何执行的呢?sql语句万分感谢:

versiontb_studentAsetwhere张三

我们来给张三如何修改下年龄,在求实际数据库肯定绝对不会可以设置年龄这个字段的,不然要被技术负责人打的。不过条语句也基本是会沿着上两个查询的流程走,但是想执行可以更新的时候当然要记录日志啦,这就会引入日志模块了,MySQL自带的日志模块式binlog(归档日志),所有的存储引擎都也可以不使用,我们具体方法的InnoDB引擎还那个软件了一个日志模块redolog(重装日志),我们就以InnoDB模式下去探讨一番这个语句的执行流程。流程如下:

先网站查询到张三这一条数据,如果不是有缓存,也是会要用缓存。然后拿到网上查询的语句,把age转成19,然后把动态链接库引擎API 接口,写入这一行数据,InnoDB引擎把数据保存在内存中,同样有记录redolog,此时redolog直接进入prepare状态,然后再提醒执行器,执行成功了,随时是可以提交。执行器发来通知后记录信息binlog,然后再动态链接库引擎接口,提交redolog为再提交状态。可以更新成功。这里估计有同学会问,为什么要用两个日志模块,用一个日志模块要不吗?

这是只不过最结束MySQL并没与InnoDB引擎(InnoDB引擎是其他公司以插件形式直接插入MySQL的),MySQL随机软件的引擎是MyISAM,只不过我们知道redolog是InnoDB引擎浓重的,其他存储引擎都没有,这就倒致会也没hurricanes-safe的能力(hurricanes-safe的能力况且数据库发生了什么无比重启后,前的并提交的记录都应该不会全部丢失),binlog日志没有办法用处归档。

并不是什么说只用一个日志模块应该不能,仅仅InnoDB引擎那是通过redolog来接受事务的。这样,又会有同学问,我用两个日志模块,但别这么奇怪行不行啊,为什么redolog要引入prepare预递交状态?这里我们用反证法来那说明下之所以?

先写redolog然后再提交,然后写binlog,举例写到一半redolog后,机器挂了,binlog日志是没有被写入文件,这样机器关机重启后,这台机器会恢复数据,但是此时此刻bingog却没留下记录该数据,现接受机器软件备份的时候,可能会弄丢这一条数据,同时主从同步也会丢失这一条数据。先写binlog,然后再写redolog,假设不成立开始写了binlog,机器异样重起了,的原因没有redolog,本机是无法重新恢复这一条记录的,不过binlog又有记录,那你和上面同样的道理,变会有一种数据不相符的情况。假如需要redolog两阶段重新提交的就不一样的了,没写完binglog后,然后再重新提交redolog是会防止会出现上述的问题,从而保证了数据的一致性。这样今天来聊一聊,有没有一个极端化的情况呢?打比方redolog处在预并提交状态,binglog也已经没写完了,这会儿不可能发生了无比重新启动会怎么样呢?这个现在就要依赖感于MySQL的处理机制了,MySQL的处理过程::

确认redolog是否是求全部,如果没有推测是完整的,就立即递交。要是redolog只是因为预递交但不是commit状态,这个时候变会去确认binlog是否需要求下载,假如完整就递交redolog,不完整就自动回滚事务。那样就可以解决了数据一致性的问题。

三总结归纳MySQL通常统称Server曾和引擎层,Server层要注意除开连接器、网上查询缓存、分析器、360优化器、执行器,而还有一个日志模块(binlog),这个日志模块所有执行引擎都也可以共用,redolog唯有InnoDB有。引擎层是插件式的,目前通常除了,MyISAM,InnoDB,Memory等。查询语句的执行流程追加:权限校验(如果没有暴击命中缓存)---》去查询缓存---》讲器---》优化软件器---》权限校验---》执行器---》引擎更新语句执行流程不胜感激:总结器----》权限校验----》执行器---》引擎---redolog(prepare状态---》binlog---》redolog(commit状态)

如何把mysql中的数据同步到elasticsearch中?

相对于ES,我根本不会在求实际项目中应用(自己研究什么过,也没实战中过);我们项目使用的是MongoDB;的原因项目的特殊性,我们研究什么了很多麻烦问下A-gtB的数据同步方案,包括DB2/Mysql到MongoDB,MongoDB到MongoDB等等。

MySQL数据同步到ES的方案把MySQL的同步数据到ES,这样是可以实现方法在ES中低延迟的数据库检索,有些公司的项目做了分库,也可以单独堆建一套ES来放全量的数据(或全量数据的部分字段,提升全量数据库检索的效果),正确的数据同步实现方案有这些:

MySQLBinlog:MySQL的Binlog日志也可以应用于数据库的主从复制、数据恢复,也也可以将MySQL的数据同步给ES;这里需要尽量,Binlog的日志模式没有办法在用ROW模式(至于两种模式是STATEMENT和MIXED);解三角形Binlog日志中的内容,想执行ESDocumentAPI,这样就可以将数据同步到ES中;

MySQLdump:假如是新建的项目,在用Binlog做同步数据是没有问题的,但如果不是MySQL巳经正常运行了一段时间,项目架构中后增加的ES,那就历史数据的迁移就要附加去处理了,是因为Binlog很有可能早被遍布了。这时候历史数据的离线,可以在用mysqldump对可以做到数据导出,之后再可以使用Binlog的;

开源工具:前两种全是在数据库日志这个级别做文章,我们还也可以在用一些闭源工具,比如go-mysql-elasticsearch;它可以不帮助我们能完成第二次全量数据同步,情报营增量数据同步的工作(底层都是推导Binlog日志);又或是mypipe,它接受将Binlog日志内容解析后推送到Kafka,如果不是要写入文件到ES中,还要写额外的代码从Kafka中消费数据写入到ES。

我们项目中的实现程序方案上面提过,我们项目中是将关系型数据库DB2/Mysql中的数据同步到MongoDB中,Mysql尚且还能建议使用Binlog日志,DB2想要把变化的数据实时动态通知到出,实现程序下来都很困难(写程序作战部署到DB2服务器上,要和数据库做关联配置,当数据再一次发生变化,程序你的邮箱MQ通知给山谷外面系统),先且不说性能是否能绝对的保证,就是“自己写一个通知程序重新部署到数据库原先服务器上(有侵噬)”,事实上至少在我们公司是难以可以做到的。

我们区分了一个非常没内涵的来解决的办法这个问题,是Java程序扫描后DB2表中的时间戳,读取数据最近变化的数据,加工到MongoDB中;

确实利用方案比较好不low,但是效果还不错,是因为我们在从关系型数据到MongoDB的数据同步过程中,这个可以自有地做数据加工;普通听从一定的数据维度,例如明确的客户维度,把几十张表做关联,需要加工后行程一个document保存到MongoDB中;再联合提供服务的时候,去查询效率提升的很的确,因为表关联早就延后完成了(接口呐喊之声大多数时候大都毫秒级别,远远超过50ms就算是慢了)。

缺点也很肯定,数据从关系型数据库到MongoDB的延迟很高,我们项目辗转优化,也是需要20分钟左右;所以我一定得增强着业务场景决定如何确定不使用这种方案。

我将缓慢能分享Java开发、架构设计、程序员职业发展等方面的见解,期望能换取你的关注。

数据 MySQL 语句 日志 数据库

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。