MySQL主要分为Server
层,跟存储引擎层。
Server
层负责“逻辑处理”,包括连接器、分析器、优化器、执行器以及所有内置函数。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层跟文件系统交互,负责数据读写。可插拔式架构,支持InnoDB、MyISAM、Memory、Archive等多个存储引擎。默认使用InnoDB。
架构图如下:
SQL执行的过程如下:
连接器
负责client到server的连接管理、权限认证
client连接到server之后,连接器通过权限表查出该连接的权限。后续所有的操作权限都依赖于这此。同时,权限的更新不会影响到已经建立的连接。需要重新建立连接才能使权限变更生效。
解析器
-
词法分析,找出关键字(比如
select
)跟非关键字(比如table name
)。 -
语法分析,构建语法树,判断语句的语法是否正确,。不正确时会提示:“You have an error in your SQL syntax”。
对于语句select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1的解析树如下:
优化器
执行计划生成,索引选择
在语句涉及到多个索引时,或者多表关联时,由优化器来决定使用哪个索引或者表之间的连接顺序以达到更高的执行效率。
执行器
操纵存储引擎来返回执行结果
对于where
子句中没有涉及到索引的语句,执行器会通过存储引擎提供的接口逐行取出所有数据来判断相关数据是否符合where
子句
对于where
子句中涉及到非唯一索引的语句,执行器会调用存储引擎接口逐行取出所有满足该索引条件的数据进行where
子句中其他条件的比对
对于where
子句中涉及到唯一索引的语句,执行器会调用存储引擎接口取出一条满足该索引条件的数据进行where
子句中其他条件的比对
注意,这里执行器调用存储引擎一次,引擎内部可能扫描了多行。而在满查询日志中有一个rows_examined
字段。其描述的是前者,所以,这个rows_examined
通常是小于等于引擎扫描的行数。
存储引擎
提供读写接口