架构图:

Mysql 逻辑架构- 连接层
当 Mysql 启动(Mysql 服务器就是一个线程),等待客户端连接,每一个客户连接请求,服务器都会创建一个线程来处理(如果是一个线程池的话,就分配一个空闲线程来处理),每个线程独立,拥有各自的处理空间,但是如果这个请求只是查询,就没关系,但是若是修改同一块内存,就会出现数据同步的问题。
连接到服务器,服务器会对用户名,密码等进行验证,一旦连接成功,还会验证是否具有什么查询的权限。
Mysql 逻辑架构- sql处理层
这一层主要功能有:SQL 语句的解析,优化,缓存的查询,MYSQL 内置函数实现,跨存储引擎功能,例如存储过程,触发器,视图等。
其流程为:
- 如果是查询语句,首先会从缓存中查找是否已经有对应结果,有则直接返回结果,无需下一步。(缓存会缓存sql语句,sql的执行计划,还有数据,但是数据默认不开启缓存)
// 查询缓存是否开启,query_cache_type 为 ON 表示已经开启
show variables like '%query_cache%';
// 开启缓存
set session query_cache_type = ON;
// 设置缓存大小
set global query_cache_size = 600000;- 解析查询,创建一个内部数据结构(解析树),这个解析树用来SQL 语句的语义和语法解析;先进行词法解析,判断是否缺少括号,逗号等,然后进行语法解析:
- 优化:优化 SQL 语句 , 例如重写查询,决定表的读取顺序及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息,是否对特定索引有查询优化等。
// 查看执行计划
EXPLAIN 查询的sql语句流程图:

Mysql 逻辑架构- 存储引擎层
MyISAM
- MyISAM 5.5 之前默认的存储引擎,MyISAM 存储引擎由 MYD 和MYI 组成,不支持事务,但是查询快。
- 适用场景:非事务型应用(数据仓库,报表,日志数据),只读类应用,空间类应用(空间函数,坐标)。
使用 MyISAM 存储引擎的表,对应的文件数据:

frm: 任何存储引擎都有,用来存储表结构。
myd: 存储数据文件。
myd: 存储索引文件。
非聚集索引: 数据与索引分开存放的。所以 MyISAM 为非聚集索引。
MyISAM 的特性:
- 并发性与锁级别:表级锁。
- 支持全文索引。
- 支持数据压缩。myisampack -b -f testmysam.MYI
Innodb
- 5.5版本后默认的存储引擎,支持行级别的事务锁。
- 5.6以前,默认为系统表空间,5.6以后为独立表空间
- 适用场景:适合于大多数OLTP 应用
独立表空间的好处:
- 系统表空间无法简单的收缩文件大小
- 独立表空间可以通过 optimize table 收缩系统文件
- 系统表空间会产生IO瓶颈
- 独立表空间可以同时向多个文件刷新数据
是否开启独立表空间:innodb_file_per_table:
- on: 独立的表空间 tablename.ibd
- off: 系统表空间 ibdataX
说明:使用独立表空间,会生成一个idb文件(存储的是数据+索引),如果使用的是系统表空间,这些都会统一存放在ibdataX文件里
Innodb 的特性:
- Innodb 是一种事务性存储引擎
- 完全支持事务的ACID
- Redo Log 和 Undo Log
- Innodb 支持行级锁(并发程度更高)
MyISAM 与 Innodb 的对比:
对比项 | MyISAM | Innodb |
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 锁表,即使操作一条数据也会锁整张表,不适合高并发操作(但是写支持高并发) | 行锁,操作时锁某一行,适合高并发操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引,还缓存真实数据,对内存要求高,并且内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
CSV
组成:数据以文本方式存储在文件中。
- csv 文件 存储内容
- csm 文件存储表的元数据,如表的状态和数据量
- .frm 表结构
特点:
- 以CSV 格式进行数据存储
- 所有列都不能为Null
- 不支持索引(不适合大表,不适合在线处理)
- 可以对数据文件直接编辑。 编辑后需要使用flush tables 命令才刷新表
Archive
组成:以zlib 对表数据进行压缩,磁盘I/O更少数据存储在ARZ 为后缀的文件中
特点:只支持 insert 和 select 操作 只允许在自增ID 列上加索引
应用:日志和数据采集应用。
Memory
特点:
- 数据存储在内存中
- 支持 HASH 索引和 BTree 索引
- 所有字段都是固定长度 例如:varchar(10),及时存两个字符,占位也是10
- 不支持 Blog Text 等大字段
- 使用表级别的锁
- 最大大小 由 max_heap_table_size 参数决定
组成:只有一个.frm 文件,因为数据存放在内存中

临时表:会话级别的,其他会话无法访问。
Memory : 非会话级别,重启mysql 会消失。
Ferderated
特点:默认未开启,开启方式:my.ini 文件 加上 ferderated=1,然后重启数据库
- 提供了访问远程 Mysql 服务器上表的方法
- 本地不存储数据,数据全部放在远程服务器上
- 本地需要保存表结构和远程服务器的连接信息。
使用场景:偶尔统计分析,以及手工查询
学习年限不足,知识过浅,说的不对请见谅。
世界上有10种人,一种是懂二进制的,一种是不懂二进制的。
















