Mysql架构介绍
Mysql 储存引擎
Mysql数据库以及其分支最重要的储存引擎有 Innodb, MyISAM, Memory 简单说 存储引擎就是表的存储类型和表的存储方式
存储引擎是概念是Mysql的特色, 是一个可插拔式的引擎架构.
我们可以通过SHOW ENGINES 语句查看
show engines
列名 | 备注 |
---|
engines | 存储引擎名称 | Support | YES表示当前版本支持的储存引擎,DEFAULT表示默认使用 | Comment | 备注介绍 | Transactions | 是否支持事务 | XA | | Savepoints | |
我们主要关注 InnoDB, MyISAM, Memory 三个储存引擎
Innodb
- InnoDB是事务型数据库首选存储引擎, 支持ACID, 简单说就是支持事务完整性一致性
- InnoDB支持行级锁.行级锁可以在最大程度上支持并发,以及类似Oracle的一致性读,多用户并发
- InnoDB是为处理巨大数据的最大性能设计,InnoDB存储引擎完全与Mysql服务整合,InnoDB储存引擎为了在主内存中缓存
数据和索引 而维持他自己的缓存池 - InnoDB支持外键约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显示定义主键,InnoDB会为表生成一个ROWID,并以此作为主键
- InnoDB支持崩溃数据恢复, InnoDB存储引擎中就是依靠redo log来保证的, 当数据库异常崩溃, 再次重启后会根据redo log进行数据恢复,来保证恢复到奔溃前状态
MyISAM
- MyISAM不支持事务,所以对事务有要求的场景不能使用
- 其锁定机制是表级锁,虽然让锁定的实现成本变小了, 但是大大降低的并发性能
- 不仅再写入的时候堵塞其他的读, 也会在读的时候堵塞其他的写, 单读本身不会堵塞其他的读
- 只会缓存索引,MyISAM可以通过KEY_BUFFER缓存, 以大大提高访问性能减少磁盘IO,但是这个缓冲区只会缓存索引不会缓存数据
- 适用不需要事务支持**(不支持),并发相对较低(锁问题),数据修改相对较少(堵塞问题)**,已读为主的场景
Memory
Memory 是一个特殊的存储引擎, 使用存储在内存中的内容创建表, 而且表的数据也在内存中
- 每个Memory存储引擎的表实际对应一个磁盘文件,该文件名与表名一直, 类型为frm, 该文件存储表的结构,数据则在内存中
- Memory默认使用哈希索引, 如果想使用B型索引, 需要再创建索引的时候指定
- Memory存储引擎因为数据在内存中, 如果内存出现异常重启或者关机数据就会丢失
Mysql逻辑架构
Mysql逻辑架构主要分为三层
- 第一层客户端层
- 所包含的并不是Mysql独有的技术,他们是服务于c/s程序, 或者是这些程序需要的, 诸如连接处理, 身份认证, 安全性等功能均在这一层处理
- 第二层SQL层(SQL Layer)
- 因为这是Mysql的核心部分,通常叫做核心服务层, 在Mysql数据库处理底层数据之前的所有工作都在这一层完成包括,权限判断,SQL解析,执行计划优化,Query cache的处理以及所有内置函数,存储过程,视图,触发器等等
- 第三层存储引擎层
- 是底层数据存取操作的实现,由多种存储引擎组成,他们负责存储和读取所有在Mysql的数据,每个存储引擎都有自己的优势和劣势, 通过存储引擎API来与他们交互,这些API隐藏了各个引擎不同的地方,对于查询出可以透明
SQL执行流程
这一块我认为是这样的, 有不正确的地方希望大家可以指出 学习进步
架构图
Connection Pool(连接池)
是为了解决资源的频繁分配, 释放所造成的问题而为数据库建立的一个缓存池. 原理是预先在缓存池中放入一定数量的链接, 当需要建立连接时从缓存池中那出一个, 使用完毕再放回去,
它的作用是进行身份验证,线程重用,连接限制,管理用户链接,线程处理等需要缓存的需求
SQL Interface(SQL接口)
接受用户的SQL命令.并且返回用户需要查询的结果,比如SELCT FROM 就是调用SQL interface
parser(解析器)
解析器.验证和解析SQL命令,这个过程主要对语法规则进行解析和验证. 并生成一颗对应的解析树, 比如SQL中是否使用了错误的关键字或者关键字的顺序是否错误了
Optimizer(优化器)
SQL语句在查询之前,会使用查询优化器对插叙进行优化,得出一个最优策略,多数情况下一条查询有多种执行方式, 最后返回相同结果, 优化器的作用就是找出最好的执行计划
Cache & Buffer(查询缓存)
将查询结果缓存到内存中,与该查询语句 的Hash值进行对应,当查询结果的基表发生任何变化,Mysql都将缓存进行失效,如果查询缓存命中了查询结果就可以直接去查询缓存中取结果,**这个查询缓存是由一系列小缓存组成比如表缓存,记录缓存,Key缓存,权限缓存 **等
Pluggable Storage Engines(可插拔存储引擎)
Mysql中区别于其他数据库的最重要的特点就是 插件式的储存引擎接口模块,这个可以说是Mysql最有特色的一个特点, 这个模块实际上是一个抽象类, 根据Mysql AB公司提供的文件访问层的一个抽象接口来定制一中文件访问机制,这种访问机制就被成为储存引擎
|