1、连接器
▪ 连接器负责跟客户端建立连接,获取权限、维持和管理连接。
– 用户名密码验证。
– 查询权限信息,分配对应的权限。
– 可以使用show processlist查看现在的连接。
– 如果太长时间没有动静,就会自动断开,通过wait_timeout控制,默认8小时。
2、查询缓存
▪ 当执行查询语句的时候,会先去查询缓存中查看结果,之前执行过的sql语句及其结果可能以key-value的形式存储在缓存中,如果能找到则直接返回,如果找不到,就继续执行后续的阶段。
▪ 但是,不推荐使用查询缓存:
– 1、查询缓存的失效比较频繁,只要表更新,缓存就会清空。
– 2、缓存对应新更新的数据命中率比较低。
3、分析器
▪ 词法分析:Mysql需要把输入的字符串进行识别每个部分代表什么意思。
– 把字符串T识别成表名T– 把字符串ID识别成列ID 。
▪ 语法分析:根据语法规则判断这个sql语句是否满足mysql的语法,如果不符
合就会报错“You have an error in your SQL synta”。
4、优化器
▪ 在具体执行SQL语句之前,要先经过优化器的处理。
– 当表中有多个索引的时候,决定用哪个索引。
– 当sql语句需要做多表关联的时候,决定表的连接顺序等等。
▪ 不同的执行方式对SQL语句的执行效率影响很大。
– RBO:基于规则的优化。
– CBO:基于成本的优化。
5、执行器
▪ MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,开始进入了执行器阶段,开始执行语句。
– 开始执行的时候,要先校验该用户是否有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就会去调用引擎的接口,返回接口执行的结果。
总结:
连接器主要负责客户端的连接、获取权限、管理连接;
缓存查询主要记录执行的语句和结果,通过key-value形式存储;
分析器主要负责根据语法规范校验sql语句;
优化器主要使用不同的执行方法对sql的索引的使用;
执行器主要是校验用户权限,再根据结果进行调用引擎接口,执行语句,返回结果