首先客户端是要与mysql服务器进行连接,去进行身份认证的过程(这里的连接方式有三种TCP/IP、共享内存和命名管道、Unix域套接字),判断账号密码是否正确。之后就去查询缓存,如果缓存中有就直接返回,但是这个缓存的步骤不太好,就是对于一个表,只要有更新就会将该表的缓存全部清空,好像是8.0之后就取消掉这个步骤了。再之后会经过分析器,就是先提取出语句的关键字,比如select,from 哪个表这些,然后判断该语句是否符合语法的规范。再之后就会经过优化器,就是让这条sql如何去做,例如就是当语句涉及到多个索引时,决定使用哪个索引,当是多表关联时,会决定连接的一个顺序。最后就是执行器了,先去判断是否对这个表有操作权限,再去看有没有命中索引,没有的话,嗯。。假设我们的存储引擎是InnoDB,如果没有命中索引,那就在存储引擎层中先取第一行,再去server层进行判断是否符合条件,满足条件就放进一个结果集中,再去找下一行。而如果命中索引的话,因为mysql5.6之后就支持索引下推的一个功能的,就是执行器会先去调用“满足条件的第一行”的接口,之后再去调用“满足条件的下一行”的接口,就是说,在存储引擎层就完成对数据的过滤,再统一加载到server层,减少了回表的次数。最后就是将结果集返回给客户端。嗯。。大概就是这样。
