第一步 连接器(管理连接,权限验证)
连接器主要负责客户端建立连接,获取权限,维护和管理连接
1). 判断当前账号密码是否错误
2). 获取当前账号的权限(如果修改权限需要重新链接)
第二步 查询缓存(命中则返回缓存)
查询缓存主要负责查询SQL语句存在缓存则直接返回内容
SELECT * FROM table_a WHERE id=1
上面查询请求后,会先查询缓存,看看之前是不是执行过这条语句 如果执行过会形成key value的形式存储在内存中,key是查询的语句,value是查询的结果直接返回给客户端
如果不存在就会进入下面的阶段,执行结果会存在缓存中,下次可以直接查询缓存减少执行步骤,提高了查询效率,
建议不要使用
经常失效 例如 一张表经常 增删改 这个表的查询缓存会被经常清空.费劲巴拉存的缓存,还有使用就给干掉了,加大了数据库压力
当然如果你有一个静态日志表系统配置表,不经常更新可以使用查询缓存
MySQL8.0已经删除该功能
第三步 分析器(词法分析,语法分析)
分析器主要负责对SQL语句进行分析
SELECT * FROM table_a WHERE id=1
每个字符串代表什么意思 例如上面查询 'select' 为关键字 'table_a' 为表 id为列,进行语法分析完之后会判断SQL语句是否满总MySQL语法,错误会在这个返回信息
第四步 优化器(执行计划生成,索引选择)
优化器主要负责对表中的多个索引查询执行的效率优化
SELECT * FROM table_a WHERE id=1 and type=1
例如上面查询 先查询id=1再查询type=1,还是先查询type=1再查下id=1,两个查询执行结果是一样的但是执行效率不一样,这个时候就需要优化器处理了
第五步 执行器(操作索引,返回结果)
执行器主要负责对SQL语句进行执行
执行先判断是否有执行的权限,如果没有返回权限错误,如果有权限就会执行,打开表的时候执行器根据表的存储引擎定义,去使用引擎提供的接口
SELECT * FROM table_a WHERE type=1
上面SQL语句执行器的执行流程
存储引擎接口获取表的第一行判断type是否等于1,重复执行逻辑判断直至最后一行, 执行器把满足条件的所有集合返回给客户端