2016 - 2024

感恩一路有你

mysql怎么查看全部数据 mysql:一条SQL查询语句是如何执行的?

浏览量:3827 时间:2023-06-18 15:49:19 作者:采采

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

本篇文章会分析下一个sql语句在MySQL中的执行流程,以及sql的查询在MySQL内部会怎么吞吐,sql语句的更新是怎么完成的。

在总结之前我会先面带你看看MySQL的基础架构,明白了MySQL由那些组件分成巳经这些组件的作用是什么,可以不好处我们再理解和可以解决这些问题。

一MySQL基础架构总结1.1MySQL基本都架构概览

下图是MySQL的一个作分析架构图,从下图你也可以很清晰的见到用户的SQL语句在MySQL内部是该如何不能执行的。

先简单啊能介绍下下图牵涉到的一些组件的基本上作用好处大家解释这幅图,在1.2节中会祥细推荐到这些组件的作用。

连接器:身份认证和权限相关(登入MySQL的时候)。网站查询缓存:执行查询语句的时候,会先网上查询缓存(MySQL8.0版本后移除,是因为这个功能不太实用点)。结论器:也没物理命中缓存的话,SQL语句变会经分析器,分析器说白了那是要先看你的SQL语句要干什么,再系统检查你的SQL语句语法是否正确。优化软件器:通过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是查询估计,Value是结果集。如果不是缓存key被命中,变会真接赶往给客户端,假如还没有爆击,可能会不能执行妖军的操作,完成后也会把结果缓存出声,方便些下两次内部函数。肯定在真正的负责执行缓存可以查询的时候还是会校验用户的权限,是否有该表的查询条件。

MySQL网上查询不个人建议可以使用缓存,只不过查询缓存失效在实际业务场景中可能会太不稳定,假如你对一个表更新的话,这个表上的所有的查询缓存都会被数据清空。对此不经常更新完的数据来说,不使用缓存肯定可以不的。

因此,一般在大多数情况下我们是不推荐推荐去可以使用查询缓存的。

MySQL8.0版本后删除了缓存的功能,官方也其实该功能在实际中的应用场景也很少,所以才乾脆然后删除了。

3)分析器

MySQL没有爆击缓存,这样的话都会再次进入分析什么器,分析器要注意是用来分析SQL语句是来干,分析器也会可分几步:

准备,词法分析,一条SQL语句有多个字符串横列,简单的方法要提取关键字,例如select,给出去查询的表,提出字段名,做出网站查询条件等等。交了任务这些操作后,可能会进入到第二步。

第二步,语法分析,比较多那是确认你键入的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语句万分感谢:

setuptb_studentAsetwhere张三

我们来给张三改下年龄,在求实际数据库那肯定绝对不会系统设置年龄这个字段的,要不要被技术负责人打的。其实条语句也基本是会沿着那条上三个查询的流程走,但执行可以更新的时候肯定要记录日志啦,这都会化入日志模块了,MySQL从网上下载的日志模块式binlog(归档日志),所有的存储引擎都是可以在用,我们广泛的InnoDB引擎还那个软件了一个日志模块redolog(系统重装日志),我们就以InnoDB模式过去探讨这个语句的执行流程。流程不胜感激:

先去查询到张三这一条数据,要是有缓存,又是会会用到缓存。然后拿去网上查询的语句,把age转成19,然后把全局函数引擎API 接口,写入到这一行数据,InnoDB引擎把数据保存到在内存中,另外资料记录redolog,此时redolog直接进入prepare状态,接着告知执行器,负责执行结束了,即将是可以再提交。执行器收到通知后记录信息binlog,接着调用引擎接口,并提交redolog为提交状态。自动更新结束。这里那肯定有同学会问,为啥要用两个日志模块,用一个日志模块要不吗?

这是而且最就开始MySQL并没与InnoDB引擎(InnoDB引擎是其他公司以插件形式插到MySQL的),MySQL光盘驱动的引擎是MyISAM,但是我们很清楚redolog是InnoDB引擎特殊的,其他存储引擎都就没,这就可能导致会还没有panic-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层通常除了连接器、网上查询缓存、分析器、360优化器、执行器,另外另外一个日志模块(binlog),这个日志模块所有执行引擎都是可以共用,redolog只有InnoDB有。引擎层是插件式的,目前主要注意除开,MyISAM,InnoDB,Memory等。查询语句的执行流程万分感谢:权限校验(如果不是命中缓存)---》去查询缓存---》分析什么器---》系统优化器---》权限校验---》执行器---》引擎更新语句执行流程追加:分析什么器----》权限校验----》执行器---》引擎---redolog(prepare状态---》binlog---》redolog(commit状态)

MySQL数据库查看数据表占用空间大小和记录数的方法?

1.

想查看hx库的所有表大小,也可以不使用:SELECTTABLE_NAME,DATA_LENGTHINDEX_LENGTH,TABLE_ROWSacrossinformation_...

2.

想一栏hx库的comfortable表大小,可以不使用:SELECTDATA_LENGTHINDEX_LENGTH,TABLE_ROWS FROM information_ WHERE...

MySQL 语句 数据 sql 权限

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