MySQL架构基本示意图mysql
Server层包括客户端,链接器,分析器,优化器,执行器;
存储引擎层负责数据的存储和提取.其架构模式是插件式的,支持 InnoDB、MyISAM、Memory等多个储存引擎.最经常使用的是InnoDB,它从MySQL5.5.5版本开始成为了默认存储引擎.
复制代码
连机器负责跟客户端创建链接、获取权限、维持和管理链接。sql
链接命令:mysql -u root -p
复制代码
MySQL 拿到一个查询请求后,会先到查询缓存看看,以前是否是执行过这条语句。以前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。若是你的查询可以直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。数据库
若是语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你能够看到,若是查询命中缓存,MySQL 不须要执行后面的复杂操做,就能够直接返回结果,这个效率会很高。缓存
可是大多数状况下我会建议你不要使用查询缓存,为何呢?由于查查询缓存每每弊大于利。bash
查询缓存的失效很是频繁,只要有对一个表的更新,这个表上全部的查询缓存都会被清空。所以极可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来讲,查询缓存的命中率会很是低。除非你的业务就是有一张静态表,很长时间才会更新一次。好比,一个系统配置表,那这张表上的查询才适合使用查询缓存。架构
开始执行以前,要通过优化器处理.优化
优化器是在表里面有多个索引的时候,决定使用哪一个索引;或者在一个语句有多表关联(join)的时候,决定各个表的链接顺序。ui
开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,若是没有,就会返回没有权限的错误,以下所示 (在工程实现上,若是命中查询缓存,会在查询缓存返回结果的时候,作权限验证。查询也会在优化器以前调用 precheck 验证权限)。spa
mysql> select * from T where ID=10;
ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'
复制代码
若是有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。插件
好比咱们这个例子中的表 T 中,ID 字段没有索引,那么执行器的执行流程是这样的:
1.调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是否是 10,若是不是则跳过,若是是则将这行存在结果集中;
2.调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
3.执行器将上述遍历过程当中全部知足条件的行组成的记录集做为结果集返回给客户端。