MySQL原理解读——基础架构
MySQL可以大致分为Server层,和存储引擎层
Server层由Mysql AB公司开发,而存储引擎层允许由其他不同公司提供实现。虽然MySQL自带MyISAM引擎,但是它的默认引擎是InnoDB,由Innobase Oy公司开发
1、Server层
一条sql请求打到mysql之后,会先进入mysql的Server层,经过连接器->(查询缓存)->分析器->优化器->执行器
1.1、连接器
当一个请求打到MySQL时,会由MySQL的连接器接收。通俗的讲,连接器的主要作用就是校验用户名密码,赋予对应的角色权限,并管理每个连接
当建立了一个连接后,如果想要修改角色权限,需要断开重连才能生效(重新登录)
1.2、查询缓存(8.0后废除)
8.0以前,MySQL会使用一块内存作为缓存,数据结构可以简单理解为是以SQL作为key、结果集作为value的hash表。当一条查询语句执行时,SQL语句并不会解析,而会先从缓存中找对应SQL的结果集,没有缓存再执行下面的流程
8.0之后,MySQL就废除了缓存的功能,原因就是一张表的缓存数据会因为表结构、表数据的更改而被清空,对于更新频繁的表,缓存命中率更是会低的不行。这就相当于占用了一块内存,却什么也没做,还不如不要缓存
1.3、分析器
分析器总共会执行两个步骤,词法分析->语法分析
词法分析的主要任务就是把SQL中的每段字符串翻译成在MySQL中代表的含义
语法分析就是验证经过词法分析翻译的这段SQL符不符合MySQL的语法
1.4、优化器
优化器会根据一定的算法,计算出执行这条SQL可能效率最高的方案,比如索引的选择、表连接的顺序等
但优化器的优化有时会起到反作用,导致索引失效,所以有时需要根据实际情况手动优化SQL
1.5、执行器
执行器是真正执行SQL语句并发回结果的步骤
执行器在执行前会先判断当前请求有没有操作对应表的权限
最简单的查询流程,执行器会调用存储引擎提供的接口,遍历表中的每一行数据,把符合条件的行数据作为结果集返回
2、存储引擎
MySQL的存储引擎是以插件的形式运行,常见的有Memory、MyISAM、InnoDB
对于存储引擎,目前只了解了他们的一些特征
Memory | MyISAM | InnoDB | |
---|---|---|---|
支持事务 | N | N | Y |
支持外键 | N | N | Y |
空间占用 | 低 | 低 | 高 |
内存占用 | 高 | 低 | 高 |
支持数据压缩 | N | Y | N |