导图社区 mysql架构和Innodb存储引擎
包含了MySQL逻辑架构,日志文件,数据文件,一条sql执行流程,存储引擎种类,InnDB架构中的内存结构、表空间、磁盘文件存储结构,内存数据落盘中的整体分析、Redo日志落盘、Check Point机制、Double Write双写机制。
mysql事务篇,主要用于处理操作量大、复杂度高的数据。事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
mysql架构和Innodb存储引擎
逻辑架构
客户端连接器
sdk 驱动
controller
连接池
权限认证
线程拒绝
连接限制
server
SQL接口
解析器
查询优化器
缓存
存储引擎
Memory
MyISAM
Innodb
文件和日志
日志文件
数据文件
错误日志
记录所有严重的错误信息
通用查询日志
所有操作,包括增删改查
慢查询日志
执行时间超过long_query_time的查询sql
bin log
记录数据库所有的ddl语句和dml语句
redo log
记录增删改操作;保证持久性
undo log
进行事务回滚;mvcc机制实现过版本并发控制
relay log
主从复制中的数据传输
InnoDB
.frm 表结构定义信息
.ibd 数据和索引信息
.myi 索引信息
.myd 数据信息
一条sql执行流程
连接器
权限认证;无动作则默认8小时断开
查询缓存
相同的sql语句,才会命中缓存
分析器
词法分析
识别字符串是什么,代表什么
语法分析
判断语法是否正确,生成解析树
预处理器
检查语法树是否合法,得到一个新的解析树
优化器
使用哪个索引
多表关联,哪一个是驱动表
执行器
判断执行权限,调用存储引擎接口查询
存储引擎种类
数据存储在内存中
.frm 表定义文件 .myi 索引文件 .myd数据文件
支持表锁
不支持事务和外键
索引结构:B+树
.frm 表定义文件 .ibd 索引和数据文件
支持表锁和行锁
支持事务和外键
InnDB架构
内存结构
Buffer Pool
作用:加速数据的访问和修改
数据结构:单链表
淘汰算法:LRU算法(最近最久未被使用)
Change Buffer
加速非热点数据中二级索引的写入操作
自适应哈希索引 AHI
对频繁查询的数据页和索引页建立索引,加速查询
日志缓冲 Log Buffer
缓冲日志文件的写入操作;内存写入+日志文件顺序写
表空间
系统表空间
数据字典:表元数据信息-表结构、列信息
双写缓冲:解决写失效问题
修改缓冲
内存中 Change Buffer 对应的持久化区域
回滚日志(Undo Log)
MVCC
独立表空间
存放每个表的数据和索引
通用表空间
在系统表空间与独立表空间之间作出平衡;数据中转
Undo 表空间
存放一个或多个 undo log 文件
临时表空间
保存临时表数据
磁盘文件存储结构
段
数据段、索引段、回滚段;至少会有一个区
区
连续的页组成的空间,大小固定为 1MB;默认存储 64 个连续的页
页
InnoDB 的基本存储单位 ,每个页大小默认为 16K
行
InnoDB的数据是以行为单位存储的, 1 个页中包含多个行
内存数据落盘
整体分析
Redo日志落盘
记录:操作了(update,insert)哪页(page)的哪行(row)的数据
特点:顺序写入,效率更高
作用:事务提交之前,写入到磁盘中,保证事务的持久性 Durability
日志落盘策略参数:innodb_flush_log_at_trx_commit
策略
0:每秒写入,最多丢失1s内的事务
1:将log buffer写入redo 日志文件,并同时调用fsync刷新到磁盘中
2:将log buffer写入redo 日志文件,但是不会调用fsync刷新到磁盘中,而是操作系统判断何时将缓存写入到磁盘中
Check Point检查点机制
什么是脏页?
缓冲区中的页与磁盘中的页数据不一致
什么是CheckPoint?
将缓冲池中的脏页数据刷到磁盘上
解决什么问题?
脏页落盘
缩短数据库的恢复时间
缓冲池Buffer pool不够用时,将脏页刷新到磁盘
redo日志不可用时,刷新脏页
分类
Sharp Checkpoint
关闭数据库的时候,将buffer pool中的脏页全部刷新到磁盘中
Fuzzy Checkpoint
不同的时机,将部分脏页写入磁盘;刷新部分脏页到磁盘,避免一次刷新造成的性能问题
Master Thread Checkpoint:固定频率刷新;异步操作
FLUSH_LRU_LIST Checkpoint:缓冲池不够用时,通过LRU算法进行淘汰;如果为脏页,则刷新到磁盘
Async/Sync Flush Checkpoint:redo log日志不可用时
Dirty Page too much:buffer pool中脏页数量太多;默认75%
Double Write双写
写失效问题
将16KB的刷入磁盘,但当写入了8KB时,就宕机了
Double write脏页刷新流程
将脏页复制到内存的Doublewrite buffer
顺序地写入系统表空间的物理磁盘上
内存的Doublewrite buffer最后将页写入各自表空间文件中
Double write崩溃恢复
从系统表空间中的Double write中找到该页的一个副本
将其复制到独立表空间
清除redo日志,完成数据恢复