1
连接器
1.1.1连接器的主要职责
1、负责与客户端的通信,是半双⼯模式,这就意味着某⼀固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,⽽不能同时进⾏,其中MySQL在与客户端连接TC/IP的。
2、验证请求⽤户的账户和密码是否正确,如果账户和密码错误,会报错:Access denied for user 'root'@'localhost' (using password:
feko中文手册3、如果⽤户的账户和密码验证通过,会在MySQL⾃带的权限表中查询当前⽤户的权限。
MySQL中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表:
汇编书籍
user表:存放⽤户账户信息以及全局级别(所有数据库)权限,决定了来⾃哪些主机的哪些⽤户可以访问数据库实例
db表:存放数据库级别的权限,决定了来⾃哪些主机的哪些⽤户可以访问此数据库
tables_priv表:存放表级别的权限,决定了来⾃哪些主机的哪些⽤户可以访问数据库的这个表
columns_priv表:存放列级别的权限,决定了来⾃哪些主机的哪些⽤户可以访问数据库表的这个字段
1.1.2 MySQL权限表的验证过程
应的权限为Y,则此⽤户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv;如果为N,则到db表中检查此⽤户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
3、如果在任何⼀个过程中权限验证不通过,都会报错。
1.2 缓存
MySQL的缓存主要的作⽤是为了提升查询的效率,缓存以key和value的哈希表形式存储,key是具体的SQL语句,value是结果的集合。如果⽆法命中缓存,就继续⾛到分析器的这⼀步,如果命中缓存就直接返回给客户端。不过需要注意的是在MySQL的8.0版本以后,缓存被官⽅删除掉了。之所以删除掉,是因为查询缓存的失效⾮常频繁,如果在⼀个写多读少的环境中,缓存会频繁的新增和失效。对于某些更新压⼒⼤的数据库来说,查询缓存的命中率会⾮常低,MySQL为了维护缓存可能会出现⼀定的伸缩性的问题,⽬前在5.6的版本中已经默认关闭了,⽐较推荐的⼀种做法是将缓存放在客户端,性
能⼤概会提升5倍左右。
php和jsp哪个好1.3 分析器
分析器的主要作⽤是将客户端发过来的SQL语句进⾏分析,这将包括预处理与解析过程,在这个阶段会解析SQL语句的语义,并进⾏关键词和⾮关键词进⾏提取、解析,并组成⼀个解析树。具体的关键词包括不限定于以下:select/update/delete/or/in/where/group by/having/count/limit等。如果分析到语法错误,会直接给客户端抛出异常:ERROR:You have an error in your SQL syntax.。
⽐如:select * from user where userId =1234;
在分析器中就通过语义规则器将select from where这些关键词提取和匹配出来,MySQL会⾃动判断关键词和⾮关键词,将⽤户的匹配字段和⾃定义语句识别出来。这个阶段也会做⼀些校验:⽐如校验当前数据库是否存在user表,同时假如user表中不存在userId这个字段同样会报
错:unknown column in field list.
1.4 优化器
能够进⼊到优化器阶段表⽰SQL是符合MySQL的标准语义规则的并且可以执⾏的,此阶段主要是进⾏
SQL语句的优化,会根据执⾏计划进⾏最优的选择,匹配合适的索引,选择最佳的执⾏⽅案。⽐如⼀个典型的例⼦是这样的:
表T,对A、B、C列建⽴联合索引,在进⾏查询的时候,当SQL查询到的结果是:select xx where B=x and A=x and C=x,很多⼈会以为是⽤不到索引的,但其实会⽤到,虽然索引必须符合最左原则才能使⽤,但是本质上,优化器会⾃动将这条SQL优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是⾃动按照执⾏计划进⾏预处理,MySQL会计算各个执⾏⽅法的最佳时间,最终确定⼀条执⾏的SQL交给最后的执⾏器。
做蛋挞的视频教程1.5 执⾏器oracle11g什么时候出来的
在执⾏器的阶段,此时会调⽤存储引擎的API,API会调⽤存储引擎,主要有⼀下存储的引擎,不过常⽤的还是myisam和innodb:
2
引擎以前的名字叫做:表处理器(其实这个名字我觉得更能表达它存在的意义)负责对具体的数据⽂件进⾏操作,对SQL的语义⽐如select或者update进⾏分析,执⾏具体的操作。在执⾏完以后会将具体的操作记录到binlog中,需要注意的⼀点是:select不会记录到binlog中,只
有update/delete/insert才会记录到binlog中。⽽update会采⽤两阶段提交的⽅式,记录都redolog中。
⼆、执⾏的状态
可以通过命令:show full processlist,展⽰所有的处理进程,主要包含了以下的状态,表⽰服务器处理客户端的状态,状态包含了从客户端发起请求到后台服务器处理的过程,包括加锁的过程、统计存储引擎的信息,排序数据、搜索中间表、发送数据等。囊括了所有的MySQL的所有状态,其中具体的含义如下图:
3
三、SQL的执⾏顺序
事实上,SQL并不是按照我们的书写顺序来从前往后、左往右依次执⾏的,它是按照固定的顺序解析的,主要的作⽤就是从上⼀个阶段的执⾏返回结果来提供给下⼀阶段使⽤,SQL在执⾏的过程中会有不同的临时中间表,⼀般是按照如下顺序:
mysql语句的执行顺序
4
⼤多时候MySQL会⾃动根据SQL语句做出优化,使⽤最优的SQL语句进⾏查询。有时候MySQL⽆法根据SQL语句做出最优的优化顺序,所以还是要我们⾃⼰预判断出哪种过滤是最优,毕竟⾃⼰才最懂⾃⼰的数据。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。