Mysql架构
连接认证层
当mysql启动(mysql服务器就是一个进程),等待客户端连接,每个客户端连接请求,服务器都会新建一个线程处理(如果是线程池的话,就会分配一个空线程),每个线程独立,拥有自己的内存空间,但是如果这个请求只是查询,没关系,但若修改数据,很显然,当两个线程修改同一块内存会引发数据问题
连接到服务器,服务器需要对其进行验证,也就是用户名 IP 密码验证,一旦连接成功,还需要验证某个特定查询的权限(例如是否运行客户端堆某张表,某个库操作等)。
Sql处理层
这一层主要的功能有,Sql语句的解析,优化,缓存的查询,MySql内置函数的实现,跨存储引擎功能(就是说每个存储引擎都需提的供功能,引擎对外提供接口),例如触发器,存储过程,视图等。
- 如果是查询语句,首先会查询缓存是否有响应的结果,有则返回结果,无则进行下一步(不是查询语句直接进行下一步)
分为缓存Sql和缓存结果,缓存Sql即Sql一样就不需要在进行解析优化了,缓存结果一般不开启
-
解析查询,创建一个内部数据结构(解析树),这个数据结构主要用于sql语句的语义和语法解析
-
优化,优化Sql语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等,这一阶段是用户可以查询的,查询服务器优化器是如何优化的,便于用户重构查询以及修改相关配置,达到最优化 ,这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息,是否针对特定的索引优化等。
存储引擎
查看存储引擎
show engine
查看默认存储引擎
show viriables like‘%storage_engine%’
MyISam
Mysql5.5以前的默认存储引擎
MyISAM的数据文件有MYD和MYI组成,分别代表了数据文件以及索引文件
所有的存储引擎都存在frm文件,代表了数据表的定义与结构
特点:
- 并发与锁级别:表级别
- 支持全文检索
- 支持数据压缩(myisampack -b -f testmyisam.MYI),压缩的数据是只读的,如果修改,还是得操作为压缩的数据文件
适用场景:
- 非事务型应用(数据仓库,报表,日志)
- 只读类应用
- 空间类应用(空间函数,坐标)
InnoDB
Mysql5.5及以后默认存储引擎,
innodb_file_per_table
- on. tablename.ibd 独立表空间(每个表有自己的数据文件)
- Off indataX 系统表空间(即所有表的数据存在一个文件里面)
mysql5.6之前默认为系统表空间,系统表空间与嘟噜表空间区别
- 系统表空间无法简单收缩文件大小
- 独立表空间可以通过optimize table收缩系统文件
- 系统表空间会产生IO瓶颈
- 独立表空间可以同时向多个文件刷新数据
j建议使用独立表空间
特点:
- 支持事务,完全支持书屋ACID特性
- Redo log和Undo log
- 支持行级锁(并发程度更高)
适用场景:大部分OLTP应用
InnoDb与MyISAM对比
| 对比项 | MyISAM | InnoDB |
|---|---|---|
| 主外键 | 不支持 | 支持 |
| 事务 | 不支持 | 支持 |
| 行表锁 | 表锁,即使操作一条记录 也会锁住整个表 不适合高并发的操作 | 行锁,操作时只锁某一行, 不对其它行有影响 适合高并发的操作 |
| 缓存 | 只缓存索引,不缓存真实 数据 | 不仅缓存索引还要缓存真 实数据,对内存要求较高, 而且内存大小对性能有决 定性的影响 |
| 表空间 | 小 | 大 |
| 关注点 | 性能 | 事务 |
| 默认安装 | Y | Y |
CSV
特点
- 以CSV的数据格式进行存储
- 所有列都不能为null
- 不支持索引(不适合大表,不适合在线处理)
- 可以对数据文件直接编辑(保存文件内容)
Archive
组成:
- 以zlib对数据表进行压缩,磁盘IO跟少
- 数据存在以arz文件中
特点
- 只支持insert和select
- 只允许在自增列上加索引
适用场景:日志记录
memory
- 文件系统存储特点,也曾heap存储引擎,所有数据保存在内存中
- 支持Hash索引和BTree索引
- 所有字段都是固定长度(varchar(10)= char(10))
- 不支持blob Text等大字段
- 使用的是表级锁
- 最大大小有max_heap_table_size
使用场景:
- hash索引用于查找或者映射表
- 用于保存数据分析长生的中间表
- 用于缓存周期性聚合数据结果表
Ferderated
特点
- 提供远程访问msysl服务器上表的方法
- 本地不存储数据,数据全部存储在服务器上
- 本地需要保存表结构和服务器连接信息