前言
本篇文章介绍了mysql的架构内容,包括逻辑架构和物理架构。
mysql逻辑架构
首先,我们先来看下mysql的逻辑架构图。
- 最上层Connectors:连接器
- Management Serveices & Utilities:系统管理和控制工具
- Collection Pool:连接池
- SQL Interface:SQL接口,用于接收sql语句,DDL,DML
- Parse:sql解析器,包括语法分析-分析该sql是否符合sql语法,词法分析->形成语法树,最终就是形成一颗正确的语法树
- Optimizer:查询优化器,例如:优化索引,mysql只会使用一个最优索引,where 后面从左到右寻找过滤力度最大的先执行
- Caches & Buffers:查询缓存,把查询结果缓存起来,通过map存,key->hash(sql),这样子其实意义不大,因此5.8版本后被弃用了
- Pluggable Storage Engines:存储引擎,mysql有很多存储引擎,用得最多的应该就是前两个MyISAM和InnoDB,后面我们也会详细讲下这两个引擎
- File System:这个就是最底层的文件存储系统了
存储引擎
MyISAM:不支持事务和行锁,因此具有较高的查询和插入速度,支持三种不同的存储格式,静态型,动态型,压缩型。 InnoDB:支持事务和行锁,支持外键,具有事务处理,回滚,崩溃修复能力,并且通过多版本并发控制保证事务安全,处理能力比MyISAM稍微慢点,5.5版本以后是mysql默认的存储引擎。 Memory:内存存储引擎,因为是基于内存的,因此具有极高的插入和查询效率。缺点就是占用内存空间,且数据可能丢失。
MyISAM和InnoDB的对比
InnoDB | MyISAM | |
---|---|---|
存储文件 | .frm表定义文件 .ibd数据文件和索引文件 | .frm 表定义文件 .myd 数据文件 .myi 索引文件 |
锁 | 表锁+行锁 | 行锁 |
事务 | 支持 | 不支持 |
索引结构 | B+tree | B+tree |
CRUD | 读写 | 读多 |
mysql执行流程
` 这张图就很清晰的表达出了mysql执行的一个流程,这里就不再一个一个讲了.这里有两个鉴权模块,一个是用户模块,一个是访问控制模块,讲下这两个模块的区别。- 用户模块:这个大家应该都知道,就是登陆的时候校验用户名和密码。
- 访问控制模块:这个模块主要用于判断该用户对sql语句的表是否有对应的权限,例如,判断该用户对该表是否有执行权限还是只有只读权限。
mysql的物理结构
日志文件
- 错误日志errorlog:默认是开启的,记录运行过程中所有严重的错误信息,及mysql每次启动跟关闭的详情
- 二进制日志binlog:记录数据库所有的ddl和dml语句,select语句除外。语句以事件的形式保存,记录数据的变更顺序及执行时间。DDL语句是直接记录到日志中,dml语句只有事务提交之后才会记录到日志中.该日志主要用于数据备份,主从,恢复.
- 通用查询日志general query log:几乎什么都会记录,耗性能,生产环境不开启
- 慢查询日志slow query log:定位慢sql,用于sql调优,默认不开启
- 重做日志redo log:用于数据恢复,事务提交先落redo log再落盘
- 回滚日志undo log:用于数据回滚,MVCC控查询历史事务信息
- 中继日志relay log:跟binlog有点像,也是记录数据库变化信息,主要记录了主节点发来的数据库变化信息。
数据文件
- InnoDB数据文件:
- .frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
- .ibd:独立表空间文件,存储数据和索引信息,一张表对应一个ibd文件
- .ibdate:共享表空间,存储数据和索引信息,所有的表共享一个和多个.ibdate文件
- MyIsam数据文件
- .frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
- .myd文件:主要用于存储表数据信息
- .myi文件:主要用于存储索引信息