查询缓存:
一个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的字段,表示这个语句执行过程中扫描了多少行,这个值是累加的;