mysql的执行过程有哪些

mysql的执行过程有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一:mysql执行过程

mysql整体的执行过程如下图所示:

 mysql的执行过程有哪些

1.1:连接器

连接器的主要职责就是:

①负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行,其中mysql在与客户端连接TC/IP的

②验证请求用户的账户和密码是否正确,如果账户和密码错误,会报错:拒绝访问用户& # 39;根# 39;@ # 39;localhost # 39;(使用密码:是的)

③如果用户的账户和密码验证通过,会在mysql自带的权限表中查询当前用户的权限:

mysql中存在4个控制权限的表,<代码>分别为用户表,数据库表,tables_priv表,columns_priv表,代码>

1: <代码>用户表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例

<李>

db表:存放<代码>数据库级别> <李>

tables_priv表:<代码>存放表级别的权限> <李>

columns_priv表:<代码>存放列级别的权限> <李>

Procs_priv表:<代码>存放存储过程和函数>

2:先从用户表中的主机、用户、密码这3个字段中判断连接的ip,用户名:密码是否存在,存在则通过验证。

3:通过身份认证后,进行权限分配,按照用户,db, tables_priv, columns_priv的顺序进行验证。即先检查全局权限表用户,如果用户中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv, columns_priv;如果为N,则到数据库表中检查此用户对应的具体数据库,并得到数据库中为Y的权限,如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推

4:如果在任何一个过程中权限验证不通过,都会报错

1.2:缓存

mysql的缓存主要的作用是为了提升查询的效率,缓存以键和值的哈希表形式存储,关键是具体的sql语句,价值是结果的集合。如果无法命中缓存,就继续走到分析器的的一步,如果命中缓存就直接返回给客户端。不过需要注意的是在mysql的8.0版本以后,缓存被官方删除掉了。之所以删除掉,是因为查询缓存的失效非常频繁,如果在一个写多读少的环境中,缓存会频繁的新增和失效。对于某些更新压力大的数据库来说,查询缓存的命中率会非常低,mysql为了维护缓存可能会出现一定的伸缩性的问题,目前在5.6的版本中已经默认关闭了,比较推荐的一种做法是将缓存放在客户端,性能大概会提升5倍左右

1.3:分析器

分析器的主要作用是将客户端发过来的sql语句进行分析,这将包括预处理与解析过程,在这个阶段会解析sql语句的语义,并进行关键词和非关键词进行提取,解析,并组成一个解析树。具体的关键词包括不限定于以下:选择/更新/删除/或/在//组/有/数/限制等。如果分析到语法错误,会直接给客户端抛出异常:错误:你有一个错误在您的SQL语法。

比如:<代码> select *从用户的用户id=1234;

在分析器中就通过语义规则器将选择从这些关键词提取和匹配出来,mysql会自动判断关键词和非关键词,将用户的匹配字段和自定义语句识别出来。这个阶段也会做一些校验:比如校验当前数据库是否存在用户表,同时假如用户表中不存在userId这个字段同样会报错:未知的列字段列表。

1.4:优化器

能够进入到优化器阶段表示sql是符合mysql的标准语义规则的并且可以执行的,此阶段主要是进行sql语句的优化,会根据执行计划进行最优的选择,匹配合适的索引,选择最佳的执行方案。比如一个典型的例子是这样的:

表T,对A, B, C列建立联合索引,在进行查询的时候,当sql查询到的结果是:选择xx B=x=x和C=x。很多人会以为是用不到索引的,但其实会用的到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条sql优化为:=x, B=x和C=x,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理,mysql会计算各个执行方法的最佳时间,最终确定一条执行的sql交给最后的执行器

mysql的执行过程有哪些