# MySql体系结构
先祭出经典图
从上到下依次是
- 1. 连接层 与其他编程语言中的sql进行交互
- 2. 管理层 系统管理和控制工具
- 3. 数据库连接池 为了防止频繁的创建连接过度的损耗系统资源 而使用的一种池化技术 如c3p0 druid dbcp
- 4. SQL 接口 你输入的东西就传给他 并返回查询结果
- 5. 解析器 对你传入的内容进行解析 让存储引擎读明白
- 6. 查询优化器 将sql语句进行优化(一般的sql优化都是针对这步)
- 7. 查询缓存 第一次查询的结果 第二次在查询 直接可以在查询缓存中调用 从而节省查询时间 (在新版本已经默认关闭,原因查询命中率太低 可以通过相关sql命令启动查询缓存 后面说)
- 8. 插件式 存储引擎 如INNODB MyISAM (可以像插件一样自由切换存储引擎 不同的存储引擎 的 数据结构 是不一样的)
# INNODB体系架构
## 1. 关于INNODB的线程
关于它的职责我们逐代介绍
INNODB1.0.x版本之前
```c
while(loop主循环){
i = 0
while(i<10){
执行操作:a
线程休眠1s
i++;
//执行完成这个正好过去10s
}
每10秒执行
执行操作:b
}
```
- 工作a:
日志刷新到磁盘 [一定会发生]
合并插入缓冲(什么是插入缓冲后面讲)[有可能]
刷新脏页[有可能]
进入和后台循环[有可能]
- 工作b:
刷新脏页[有可能]
合并插入缓冲[总是]
日志刷新到磁盘[总是]
删除无用Undo页[总是]
刷新脏页到磁盘[总是]
其中发现工作a(1秒执行一次) 和 工作b(10秒执行一次)其中由很多雷同的工作 其实他们也有不同
关于不同点:
- 1. 合并插入缓冲
工作a
存储引擎会判断 一秒内的IO次数是不是小于
5次 如果小于5次 会认为当前压力很小 可以进行插入缓冲操作
工作b
会判断钱10秒内(也就是工作a执行的时间内)IO次数是不是小于200次
如果小于200次会认为压力小接着会进行合并插入缓冲
- 2. 刷新脏页
工作a
会让存储引擎会判断当前缓冲池中脏页的比例
如果脏页比例大于90%(默认值 可以通过buf_get_modified_ratio_pit 进行更改)
工作b
总是刷新脏页到磁盘,查看缓冲池脏页比例大于70%(buf_get_modified_ratio_pit)
刷新100个脏页到磁盘 如果脏页的比例少于70%只刷新10%的脏页到磁盘
- 3. 刷新日志
两个工作一样的
看看 后台循环 backgroud loop
后台循环一般会执行下面的操作
1. 删除Undo页
2. 合并插入20个缓冲
3. 跳回主循环
这三个执行可能性 都是 [总是]
4. 不断刷新100个页知道符合条件(用户操作)