上图为MySQL的简易架构图,给您有一个大概的概念,下面我将为您进行进一步的分析。mysql
链接器:sql
当链接MySQL数据库时,等待的将是MySQL服务端的链接器;链接器的职责是和客户端创建链接、获取权限、维持和管理链接。客户端链接命令通常是以下所示(建议:不要在命令中显示添加登入密码):数据库
mysql -h$ip -p$port -u$user -p$password
查询缓存:缓存
创建完链接后,就可执行select语句。执行就会走向查询缓存。架构
MySQL拿到这个查询请求后,就会先到缓存中看看,以前是否是执行了该语句。在查询缓存中数据是以key-value形式存在的,key为执行的查询请求,value为查询结果。若是执行了就直接从缓存中把结果返回给客户端,请求结束。若是语句不在缓存中,就执行后续复杂操做。学习
在大多数状况下不建议使用查询缓存,为何呢?由于查询缓存每每弊大于利。优化
查询缓存的失效很是频繁,只要对表进行了更新,该表的中查询缓存所有清除。因此每每不少时候,缓存还没使用就被清除了。对于更新压力很大的数据库来讲,查询缓存的命中率很低。若是你的业务中存在一张静态表,很长时间才会更新一次。好比,系统配置表,那这张表的查询才适合查询缓存。spa
该功能是自动配置的。能够将参数 query_cache_type 设置成 DEMAND ,这样对于默认的SQL语句就不会使用查询缓存。而对于肯定的查询语句,能够使用 SQL_CACHE 显示指定,好比以下语句:code
select SQL_CACHE * from t where id = 1;
注意:在MySQL8.0以后的版本,把查询缓存模块移除了。blog
分析器
在没有命中查询缓存后,MySQL开始真正执行语句了。这时MySQL对该语句进行解析。
分析器首先进行词法分析,一条sql由多个字符串和空格组成,MySQL须要分析出这些字符串是什么,表明什么。
作完识别以后,进行语法分析。根据词法分析的结果,语法分析器会根据语法规则对sql语句进行分析,是否符合MySQL的语法规则。
优化器
执行完分析器后,MySQL就知道该sql语句要干什么了。在开始执行以前,要通过优化器的处理。
优化器在表里存在多个索引时,选择执行哪一个索引;或者一个语句有多表关联时(join),选择各表的链接顺序。
执行器
MySQL经过分析器知道了该语句要作什么,经过优化器知道该怎么作,因而进入到了执行器阶段,开始执行语句。
开始执行以前,首先会判断用户是否有对表的执行权限(若是是在查询缓存获得结果,会在返回结果以前进行权限校验),若是没有会报错.。若是有权限,就打开表继续执行语句。打开表的时候,执行器会根据表的引擎定义,去使用引擎提供的接口。
存储引擎
MySQL区别于其余数据的最具备点的是存储引擎接口模块,MySQL可进行插拔存储引擎。
MySQL的存储引擎有不少种,好比:InnoDB、MyISAM、ISAM、Memory等。在MySQL5.6以前,默认存储引擎是MyISAM,而在该版本以后默认的是InnoDB。下表是二者以前的区别:
InnoDB | MyISAM |
|
存储文件 | .frm 表定义文件,.ibd 数据文件和索引文件 |
.frm 表定义文件,.myd 数据文件, .myi 索引文件 |
锁 | 表锁、行锁 | 表锁 |
事务 | 支持 | 不支持 |
CRUD | 读、写 | 读多 |
count | 扫表 | 专门存储的地方 |
索引结构 | B+树 | B+树 |
近期在学习MySQL数据库, 后续将会持续更新学习随笔。