SQL语句执行过程
2020-12-14 23:33:13 0 举报
SQL语句执行过程
作者其他创作
大纲/内容
存储数据,提供读写接口
管理连接,权限验证
存储引擎
分析器
词法分析,语法分析
SERVER层
连接器:第一步:连接器负责跟客户端建立连接,获取权限,维持和管理连接mysql -h$ip -u$user -p$passwd -P$portshow processlist 查看连接的客户端查询缓存建立连接后,执行select语句,执行逻辑会到第二步,查询缓存Mysql拿到一个查询请求后,会先查询缓存,看是不是之前执行过这条语句会议key-value键值对的形式,被直接缓存在内存中,key是查询的语句,value就是查询的结果如果查询能够在这个缓存中找到key,那么这个value就会直接返回客户端查询语句不在查询缓存中,就会继续后面的操作查询缓存的实效非常频繁,只要有一个表的更新,这个表上所有的查询缓存被清空分析器如果没有命中查询缓存,就要开始执行查询语句1、mysql需要对SQL语句做解析,分析器会先做词法解析,当你输入多个字符串和空格组成的SQL语句时,mysql需要识别出里面的字符串分别是什么,代表什么比如输入的select 关键字,识别出来就是一个查询语句,回他字符串识别成表明,把字符串 id 识别成列做完这些识别后,就要做语法分析,根据词法分析的结果,语法分析会根据语法规则,判断出你输入的这个SQL语句是否满足mysql语法,如果语法不对,就会提示ERROR 1064 :you have an error in your sql syntax优化器经过了分析器,mysql就知道你要做什么,在执行之前,还要经过优化器的处理优化器是表里面有多个缩影的时候,决定使用哪个索引,或者一个语句有多表关联的时候,决定各个表的连接顺序比如下面的sql语句select * from pertest1 join pertest2 using(id)where pertest1.c=10 and pertest2.d=20既可以从表pertest1里面取出存c=10的记录的ID值,再根据ID值关联到表pertest2,再判断表pertest2里面d的值是否等于20也可以从表pertest2里面取出存d=20的记录的ID值,再根据ID值关联到表pertest1,再判断表pertest1里面c的值是否等于10这两张执行方法逻辑结果是一样的,但是执行的效率有所不一样,优化器的作用就是决定选择哪个方案执行器mysql通过分析器知道你要做什么,通过优化器知道该怎么,就进行到执行器阶段开始执行语句开始执行的时候回先判断一下你对这个表ptest有没有执行查询的权限,如果没有,就会返回没有执行权限如果有,就打开表继续执行打开表的时候,执行器会根据表的引擎定义,去使用这个引擎提供的接口比如:有一个表perteest,id字段没有索引,那么执行流程是这样的调用innodb引擎接口,去这个表的第一行判断ID值是不是等于20,如果不是就跳过,如果是就将结果存在结果集中调用引擎接口取下一行,重复判断相同的逻辑,直到取到这个表的最后一行执行器将上述遍历过程中所有满足条件的行组成记录集作为结果返回给客户端,这样这个语句就执行完成了
执行器
优化器
查询缓存
Mysql可以分为server层和存储引擎层
连接器
命中,直接返回
操作引擎,返回结果
客户端
执行计划生成,索引选择
0 条评论
下一页