最近开始学习mysql相关知识,根据学到的知识点,根据自己的理解和整理,本文将分析mysql中下一个sql语句的执行流程,包括sql查询将如何在mysql内部流动如何更新sql语句。在分析之前,我将带您了解MySQL基础结构。我知道MySQL是由那些组件组成的。这些组件的功能是什么?它有助于我们理解和解决这些问题。
一,mysql架构分析
以下是mysql的简要架构图:
Mysql主要分为服务器层和存储引擎层
服务器层:主要包括连接器,查询缓存,解析器,优化器,执行器等。所有跨存储引擎功能都在此级别实现,如存储过程,触发器,视图,函数等,以及通用日志模块binglog日志模块。
存储引擎:主要负责数据存储和读取。它采用可替换的插件架构,支持多种存储引擎,如InnoDB,MyISAM和Memory。 InnoDB引擎有自己的日志模块redolog模块。
InnoDB版本5.5.5是默认引擎。
连接器
主要负责用户登录数据库,用户身份验证,包括验证帐户密码,权限等。如果用户帐户密码已经通过,连接器将查询权限表以获取用户的所有权限,然后在此权限连接。逻辑判断将取决于此时读取的权限数据。也就是说,只要连接没有被破坏,即时管理员就会修改用户的权限,用户也不会受到影响。
查询缓存
建立连接后,执行查询时,将首先查询缓存。 Mysql将首先检查sql是否已被执行。它以Key-Value的形式缓存在内存中。 Key是查询期望,Value是结果集。如果缓存键被命中,它将直接返回给客户端。如果没有命中,则将执行后续操作。完成后,结果将被缓存以用于下一次调用。当然,当实际执行缓存查询时,将验证用户的权限,以及表的查询条件是否可用。建议不要使用MySQL查询来使用缓存,因为对于频繁更新的数据,缓存的有效时间太短,往往效果不好,对于不经常更新的数据,缓存的使用仍然是可能,Mysql 8.0删除版本后,删除缓存的功能。该官员还认为该功能在实际应用场景中较少,因此它被简单删除。
分析仪
Mysql没有命中缓存,那么它会进入解析器,解析器主要用于分析SQL语句完成,解析器也将分为几个步骤:
第一步,词法分析,一个SQL语句由多个字符串组成,首先提取关键字,如select,查询表,字段名,查询条件等。完成此操作后,您将进入第二步。
第二步,解析,主要是确定你输入的sql是否正确,以及它是否符合mysql语法。
完成这两个步骤后,mysql已准备好开始执行,但如何执行,如何执行是最好的结果?这次你需要优化器来玩。
优化
优化器的作用是它考虑执行的最佳执行方案(虽然有时不是最优的),例如如何在多个索引时选择索引,如何在多表查询时选择关联顺序。
执行器
选择执行计划后,mysql就可以开始执行了。在执行之前,它将验证用户是否具有权限。如果没有权限,则会返回错误消息。如果有权限,它将调用引擎接口并返回接口。执行的结果。
二,陈述分析
2.1查询语句
说了这么多,那究竟是怎么执行sql语句的呢?实际上,我们的sql可以分为两种,一种是查询,一种是更新(添加,更新,删除)。我们先分析一下查询,声明如下:
从tb_student A中选择*,其中A.age='18'和A.name='Zhang San';
结合上述说明,我们分析了该语句的执行流程:
首先检查语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在mysql8.0版本之前,会先查询缓存,使用此sql语句作为内存中的密钥进行查询是否有结果,如果有直接缓存,如果没有,请转到下一步。
通过解析器词法分析,提取sql语句的关键元素,如解压缩上面的语句是select,提取需要查询的表名是tb_student,需要查询所有列,查询条件为id=此表的'1'。然后判断sql语句是否有语法错误,例如关键字是否正确等,如果检查没问题,执行下一步。接下来是优化器确定执行计划,上面的sql语句有两种实现方案:
一个。首先在学生表格中检查名字为“张三”的学生,然后判断年龄是否为18岁。
湾首先找出这位18岁的学生,然后问一下名叫“张三”的学生。
然后优化器根据自己的优化算法选择最佳执行效率(优化器认为有时它不一定是最好的)。然后,在确认执行计划之后,它就可以开始执行了。
执行权限检查。如果没有权限,则会返回错误消息。如果有权限,将调用数据库引擎接口以返回引擎的执行结果。