体系架构
mysql是由多个子系统构成的层次化系统,体系结构如下图所示
组件名称 | 组件作用 |
Connectors | 用来与客户端应用程序建立连接的数据库接口。比如我们常用的mysql-connector-java |
Management Services&Utilities | 系统管理与服务控制相关的辅助工具 |
Connection Pool | 负责处理与用户访问有关的用户登录,线程处理,内存和进程缓存需求 |
SQL Interface | 提供从用户接收命令并把结果返回给用户的机制 |
Parser | 针对SQL语句进行语法分析和解析,构建一个用来查询的数据结构 |
Optimizer | 优化查询语句,是对数据检索动作的效率的非常接近的优化 |
Caches&Buffers | 保证使用最频繁的数据能够以最高效率的方式被访问,提供的缓存方式:表缓存、记录缓存、键缓存、权限缓存、主机名缓存 |
Pluggable Storage Engines | 插件式的存储引擎。底层物理结构的实现,负责数据库执行实际的I/O操作,基于表结构,不是基于数据库的,可以为不同的表定制不同的存储引擎。其核心是一个抽象的文件访问接口,所以存在第三方实现的存储引擎,利用这个文件访问接口建立的新的文件访问机制 |
File system | 主要负责将数据库的数据存储在文件系统之上,并完成与存储引擎的交互 |
1、连接层
当mysql启动(mysql服务器就是一个进程),等待客户端连接,每一个客户端连接,服务器都会分配一个空的线程,每个线程独立拥有各自的处理空间。mysql的最大连接数是可以通过修改配置文件或者执行命令进行设置的
#查看最大连接数
SHOW VARIABLES LIKE '%max_connections%'
客户端连接到服务器,服务器需要进行验证(IP,用户名,密码等),连接成功后需要进行权限认证,即当前连接能够操作某个库或者某个表等
2、SQL处理层
这一层的主要功能有:SQL语句的解析、优化、查询等。
SQL的执行流程如下:
注:如果开启了查询缓存,返回结果的同时会把SQL查询结果放入缓存中。
- 如果是select语句,如果开启了缓存会先查询缓存有则直接返回结果,没有则执行下一步(如果不是select语句 则直接执行下一步)
#查看是否开启了查询缓存 默认不开启
SHOW VARIABLES LIKE '%query_cache_type%';
#查看查询缓存大小
SHOW VARIABLES LIKE '%query_cache_size%';
注:查询缓存只能在配置文件中进行开启,生产环境不建议开启,除非业务中真经常有大量的相同查询建议开启
- 解析查询:创建一个内部解析树,主要用来SQL语句的语义及语法解析
- 优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等;sql 解析器会通过优化器来优化程序员写的 sql
3、物理存储结构
#查看数据存放的路径
show variables like 'datadir';
打开文件夹后我们会看到mysql相关的一些文件
创建一个数据库之后 在这个文件夹中会多一个对应的文件夹
用户建立的表信息都会在上面的那个目录中,它和具体的存储引擎有关(此处就不一一展开了),都都会有个frm文件 存放的是表的数据结构。
迁移数据的时候可以考虑通过替换数据库文件的方式完成 速度还可以
4、存储引擎
#查看mysql提供的存储引擎
show engines;
#查看默认的存储引擎
SHOW VARIABLES LIKE '%storage_engine%';
4.1 MyISAM
MySQL5.5之前默认的存储引擎。
适用场景:
- 非事务型应用(数据仓库、报表、日志数据等)
- 只读类应用
- 空间类应用(空间函数,坐标等)
innodb越来越强大,myisam已经停止维护(很多场景都不适合使用)
4.2 Innodb
- 事务性存储引擎
- 完全支持事务的ACID特性
- Redo Log、Undo Log
- Innodb支持行级锁
对比项 | MyISAM | Innodb |
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即时操作一条操作记录也会锁整个表 不适合高并发操作场景 | 行锁,操作时只锁某一行,不对其他行有影响,适合高并发操作场景 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还缓存真实数据,对内存要求较高而且对内存大小、性能有关系 |
4.3 CSV
- 以csv格式进行数据存储
- 所有列都不能为null
- 不支持索引(不适合大表、不适合在线处理)
- 可以对数据文件直接编辑(保存文本文件内容)
4.4 Archive
- 组成
以 zlib 对表数据进行压缩,磁盘 I/O 更少
数据存储在 ARZ 为后缀的文件中 - 特点
- 只支持 insert 和 select 操作
只允许在自增 ID 列上加索引
4.5 Memory
- 文件系统存储特点
也称 HEAP 存储引擎,所以数据保存在内存中 - 支持 HASH 索引和 BTree 索引
- 所有字段都是固定长度 varchar(10) = char(10)
- 不支持 Blog 和 Text 等大字段
- Memory 存储引擎使用表级锁
- 最大大小由 max_heap_table_size 参数决定
使用场景
- hash 索引用于查找或者是映射表(邮编和地区的对应表)
- 用于保存数据分析中产生的中间表
- 用于缓存周期性聚合数据的结果表
4.6 Ferderated
- 提供了访问远程 MySQL 服务器上表的方法
- 本地不存储数据,数据全部放到远程服务器上
- 本地需要保存表结构和远程服务器的连接信息
使用场景:偶尔的统计分析及手工查询(某些游戏行业)