首先来看看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 VS MyISAM
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时最常用的两种引擎类型,我们重点来看下两者区别。
|