Mysql架构

229 阅读4分钟

前言

本篇文章介绍了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文件:主要用于存储索引信息