Mysql 逻辑架构

mysql也有自己的软件架构层次!分为4层:connectors、server、engines、fileSystem
image.png

连接器 Connectors

Mysql Server层

SQLInterface
SQL接口:接受sql语句、DDL、DML、DQL,分发到解析器 parser
解析器(Parser)
词法解析和语法解析
语法树(B+tree)

查询优化器(Optimizer)
索引可建立多个、但使用一个、使用最优Explain
多表关联 小表驱动大表

where 从左到右执行(最左原则) 过滤粒度大的先执行(where sex=’男’ and id =1,优化器先找到id=1因为它过滤力度最大)

查询缓存(Cache和Buffer)
select * from user where = 1
SQL >> 做hash后的值表示唯一值 (查询缓存就是一个:Map(key-value)方式存储)
查询结果缓存,在发生修改、删除、新增后删除缓存!
MYSQL8.0 以后不在使用这种存储方式

存储引擎(Pluggable Storage Engines)

以表为单位创建存储引擎InnoDB、MyISAM(索引结构是都B+Tree)
InnoDB、MyISAM的区别

存储引擎 说明
MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务、不支持行锁、支持三种不同的存储格式。静态性、动态性、压缩型
InnoDB 5.5版本后默认引擎,支持事务、表锁、行锁、崩溃修复、回滚和多版本并发控制的事务安全,比MyISAM稍慢,支持外键
Memory 插入、更新、查询速度很快,但不支持持久化存储,数据可能丢失,临时表可以用该存储引擎
Falcon
Archive
CSV
自定义

存储引擎的选型
可参考上面的表格!现在基本都用InnoDB。

文件系统

数据文件、日志文件

执行流程

总体执行流程

image.png

详细执行流程

image.png
image.png

物理结构

mysql是通过文件系统对数据和索引进行存储的!
从物理结构上可以分为日志文件和数据索引文件!
Linux系统中数据文件和索引文件均存储在/var/lib/mysql目录下。

日志文件

采用顺序IO方式存储(比较浪费空间)。为什么是顺序写入?因为日志只能加不能删除、修改所以适合顺序IO来写入、因此需要快速写入而顺序IO只需要记录首地址每次增加即可。
image.png
mysql-bin log
二进制日志文件,用来记录数据库变更日志(删库跑路也不怕,可恢复)。记录了DDL(直接记录)、DML(必须通过食物提交才能记录到binlog日志中)。

为什么怎么多二进制文件?重启一次就一个?
redo log iblogfile1、ib_logfile0
是什么日志?重做日志 redolog!!!! TODO
gen-log.log
通用查询日志,一般不开启!!!将会严重影响数据库性能
slow-log.log
慢查询日志,
slow_query_log=ON,long_query_time=3,slow_filename
undo log
回滚日志
relay log
中继日志
查看日志开启情况
show variables like ‘log

mysql配置文件
vim /ect/my.cnf

数据文件

采用随机IO方式存储
ib_logfile 重做日志 记录数据库的物理修改
bin_log 记录数据库的逻辑更改
slow_log 慢日志
image.png

InnoDB

.frm 文件
主要存放与表相关的数据信息,主要包括表结构的定义信息
.idb
独享表空间存储表数据和索引信息,一张表对应一个ibd文件
ibdata 文件
共享表空间存储表数据和索引信息,所有表公用使用一个或多个ibdata文件

MyISAM

.frm
表结构信息
.myd
表数据
.myi
表结构中的索引信息