简而言之

一条SQL语句 select * from student T where T.id = 5;

MYSQL分为2部分,一个是server层,一个是存储引擎层,server主要处理SQL语句,存储引擎才是存储数据的地方。

 

1.首先会分析语句指向所在的数据库,检查当前的用户名密码权限是否匹配,如果匹配就会开启与MYSQL的链接,不匹配会报错"Access denied for user"

2.(MYSQL8.0版本以上已取消)然后会去查询server层的缓存,查看之前是否执行过这条语句,如果执行过会以键值对key-value形式,key存储查询语句,value存储返回结果返回,且不会执行后面的复杂操作,如果没有命中缓存,会继续执行后面的操作,并在执行完成后存入缓存。(查询缓存基本是弊大于利,因为只要更新表,就会从新清空缓存再重新存,除非这张表基本不怎么变动,查询缓存的效率才比较高)

3.然后到server层的分析器,分析器会对SQL语句进行解析,因为SQL是由字符串和空格组成,所以会先识别空格之间的字符串是什么,代表什么,并先将student表命名为T,然后会去对语句做语法分析,判断SQL语句是否满足语法规则,如果不满足会报错“You have an error in your SQL syntax

4.经过了分析器后到server优化器,在执行前MYSQL会对语句进行自动优化处理,比如有很多索引时候选择哪一个更好,一张表连接多张表时先取出哪一边的值再判断,这些执行结果都是一样的,但是执行效率不同,优化器的作用就是决定选择哪一种方案

5.最后进入到server的执行器,执行时先判断用户对这个查询的表有没有权限,然后执行语句会去调用储存引擎中的引擎接口(InnoDB || MyIsam),然后逐渐遍历表,一行一行的找到,直到满足条件 T.id = 5 的一行,然后把这一行放到结果集里,继续往下找,直到整张表遍历完成,然后把结果集返回给客户端。

 

 

MySQL一条SQL语句的执行过程_sql语句