一条查询sql执行流程
连接器
我们和数据库进行交互的话,首先要进行连接。服务端校验账号密码无误后,就意味着一个用户成功建立连接,可以进行各种操作了。在连接的过程中,账号权限发生了改变也是感知不到的,必须重新连接才能获取账号最新权限。
缓存
建立完连接后,现在执行select就来到了第二步:查询缓存,就是以sql为key,去内存中查询结果,如果能够在缓存中找到 value,就会直接返回给客户端。如果不在缓存中,就继续往后执行,然后将结果存在内存中。不过考虑到时效性,查询mysql缓存并不是一个比较好的方案,所以在mysql8.0+直接把 缓存模板 给删掉了。
解析器
如果没有命中索引,就要开始真正执行语句了。首先会讲我们输入的字符串进行“词法解析” 识别出 表名和字段 ;然后进行 “语法分析” 看看是否符合sql语法规范。
优化器
前面识别完语法后,现在mysql就要对你的sql进行预处理了,比如你的sql有多个索引,用哪个比较好;比如关联查询表的连接顺序、以哪个做驱动表比较好。
执行器
现在离正真执行sql就差临门一脚了。他会判断你对表有没有操作权限。然后权限就直接返回异常提示;有权限就会交给引擎去执行了。