一条select在mysql中的执行过程

一条select在mysql中的执行过程_第1张图片

查询缓存:

一个select语句,会先到查询缓存中看看,若是以前执行过,直接将查询结果返回给客户端,若是查询缓存没有命中,就需要执行后面的计划

分析器

如果没有命中查询缓存,就要开始分析器了;

mysql> select sql_cache * from T where ID=10;

词法分析:比如,T识别为表,select识别为查询,ID识别为字段

语句分析:语法不对,会报错(5.5.5与8.0语法有些许不同)

优化器

经过分析器,mysql知道你要干什么了,在开始执行前,还要经过优化器的处理

优化器:在表里有多个索引的时候,决定使用哪个索引;在一个表里有多表关联时,决定各表的连接顺序;

很多时候,两种执行方法的逻辑结果是一样的,但是执行效率会有不同,而优化器就是决定选择哪个方案;

执行器

mysql> select sql_cache * from T where ID=10;

Mysql通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是进行了执行器阶段;

开始执行的时候,要先判断一下你对这个表T有没有查询的权限,如果没有,就会返回没有权限的错误:

“select command denied to user “”,for table T ”

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口;

    ●调用innodb引擎接口取这个表的第一行,遍历所有的判断字段,如果满足,就将查询结果存在结果集

      你可以在rows_examined的字段,表示这个语句执行过程中扫描了多少行,这个值是累加的;

你可能感兴趣的:(mysql,数据库)