一.MySQL 的逻辑架构图
Server 层包括连接器、查询缓存、分析器、优化器、执行器,涵盖MySQL的大多数核心服务功能,以及所有的内置函数,包括日期,时间,数学,函数等。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB,Memory 等多个存储引擎。
二.查询语句的执行流程
mysql> select SQL_CACHE * from T where ID=10
第一步:解析SQL语句---分析器
(1)词法分析:分析器需要识别SQL语句中字符串分别是什么,代表什么
MySQL 把输入的"select"这个关键字识别出来,T识别成表名T,字符串ID是列ID
(2)语法分析:语法分析器会根据语法规则,判断输入的SQL语句是否满足MySQL语法
如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒
第二步:优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
既可以先从表 t1 里面取出 c=10 的记录的 ID 值,然后根据ID值关联到表t2,再筛选t2.d=20的
也可以先从表t2里面取出d=20的记录的ID值,然后根据ID值关联到表t1,再筛选t1.c=10的
这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案
第三步:执行器
(1)检验是否有执行查询的权限
(2) 对于没有索引的表:
- 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中。
- 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
- 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端