首先来看看mysql的体系架构:
从图中来开,主要分为了几大部分
- 网络层连接服务层 mysql server存储引擎层系统文件层
我们来看一下 msyql运行的机制
再看一下mysql官网给出的inndb存储架构图
看了很多我们可以通过查询和更新来将这些组件串联起来
查询:
- 查询进入server端,依次进入 连接器 分析器 优化器 执行器
a. 连接器: 进行管理连接,权限验证
b. 分析器:
i. 词法解析:sql语句,识别出里面的字符是干什么的
ii. 语法解析:输入的sql语句是否合法
c. 优化器:
i. 决定使用哪个索引
ii. join的时候,表的连接顺序
d. 执行器:
i. 执行sql语句返回给客户端根据表id和数据页号,通过adaptive hash index 查找缓存hash表
a. hash表:key为 表空间id+数据页号,value为 缓存页面地址值如果查询到了,就直接返回,查询不到,需要到磁盘文件中查找磁盘文件会申请空闲描述数据找到对应的缓存页,加载磁盘数据到缓存页,空闲的缓存页,放入free 链表中
a. 其中有free链表描述数据其中缓存到缓存页中之后,并且把这个数据加入到一个冷数据的头部 lru链表
a. lru链表:默认7:3 热数据:冷数据的比例。
b. lru链表是一直维护的,磁盘中的文件通过一个线程一直维护这个冷热链表。
c. 一看到冷热,就知道inndb为了冷热分离,特意加了一个lru链表,将热点数据放到链表的头部。最后将查询到的结果进行返回
修改数据:
- server端修改数据先将旧的数据写入到undo log中
a. 数据库事务开始之前,会将要修改的记录存放到undo log中,当事务回滚时可以undo日志,撤销事务提交
b. undolog是逻辑日志,可以理解为sql语句,例如插入一条记录 insert,它记录相反的操作 delete一条记录在缓存页修改的记录,同时会记录到 flush链表
a. flush链表:每次修改缓存页之后,创建一个存储脏页的链表,凡是修改过的缓存页都加入到这个链表中
b. 不着急立即把修改同步到磁盘中,而是通过flush链表开启一个线程异步进行刷新同时 commit写会进入到 redo日志
a. redo日志是是innodb独有的
b. 他是一个物理日志,如果服务异常重启了,可以根据redo log进行重做
c. redo log是一个环形数组形式,写满后容易覆盖
d. 有一个参数 innodb_flush_log_at_trx_commit:
i. 1(默认值):每次事务提交执行redo Buffer->OS cache-> flush cache to disk,最安全,但是性能最差
ii. 0:没提交redo buffer ->os cache ->flush cache to disk。可能丢失一秒的数据
iii. 2:每次事务提交执行 先由redo buffer->os cache,然后由后台线程每隔1s执行OS cache->flush cache to disk。innodb 提交事务类似于两阶段提交事务:
a. redo log刷盘,binlog刷盘,redo log commit
b. binlog:mysql server自己的文件
i. 参数: sync_binlog:设置成1,每次事务提交都持久化到磁盘
ii. binlog的两个重要使用场景
1. 主从复制:在主库开启binlog功能,这样主库就可以把binlog传递给从库,从库拿到binlog后实现数据恢复达到主从一致性
2. 数据恢复:通过mysql binlog工具来进行恢复数据对比一下redolog vs binlog
a. 位置:
i. redolog 数据innodb存储引擎层
ii. binlog属于mysql server自带功能
b. 功能:
i. redolog 物理日志,记录了某个数据页做了什么修改
ii. binLog:是逻辑日志,记录的是语句的原始逻辑,比如给id=2这行字段加1
c. 写
i. redo log 内部是一个环形链表,循环写,空间固定会用完覆盖
ii. binlog是追加写,写到一定大小后就会切换到下一个,不会覆盖
d. 用处
i. redo log作为服务器异常宕机后数据自动恢复使用
ii. binlog 主从复制和数据恢复
mysql中的物理概念:
一个组数据区->包含256个数据区(extent)->一个数据区->包含64个数据页->一个数据页也就是16k->数据页中由数据行
InnoDB和MyISAM是使用MySQL时最常用的两种引擎类型,我们重点来看下两者区别。
- 事务和外键
InnoDB支持事务和外键,具有安全性和完整性,适合大量insert或update操作MyISAM不支持事务和外键,它提供高速存储和检索,适合大量的select查询操作
- 锁机制
InnoDB支持行级锁,锁定指定记录。基于索引来加锁实现。MyISAM支持表级锁,锁定整张表。
- 索引结构
InnoDB使用聚集索引(聚簇索引),索引和记录在一起存储,既缓存索引,也缓存记录。MyISAM使用非聚集索引(非聚簇索引),索引和记录分开。
- 并发处理能力
MyISAM使用表锁,会导致写操作并发率低,读之间并不阻塞,读写阻塞。InnoDB读写阻塞可以与隔离级别有关,可以采用多版本并发控制(MVCC)来支持高并发
- 存储文件
InnoDB表对应两个文件,一个.frm表结构文件,一个.ibd数据文件。InnoDB表最大支持64TB;MyISAM表对应三个文件,一个.frm表结构文件,一个MYD表数据文件,一个.MYI索引文件。从MySQL5.0开始默认限制是256TBInnoDB和MyISAM是使用MySQL时最常用的两种引擎类型,我们重点来看下两者区别。



