MySQL数据库底层
2020-10-15 16:55:17 2 举报
AI智能生成
Mysql知识点总结
作者其他创作
大纲/内容
Mysql数据库
InnoDB存储引擎
引擎特性
支持事务
支持行锁
支持外键
引擎特点
插入缓冲(提升性能)
Insert Buffer
注:插入缓冲是物理页
特性
缺点
插入缓冲实现
数据结构
放在共享空间中的全局B+树
插入过程
合并插入缓冲
Insert Buffer Bitmap会追踪辅助索引页可用空间
发生情况
1.辅助索引页被读取到缓冲池中时
2.Insert Buffer Bitmap页追踪到该辅助索引页以及没有可用空间时
3.Master Thread的循环
具体分类
Change Buffer
Delete Buffer
Purge Buffer
满足条件
索引是辅助索引
索引不是唯一的
二次写(可靠性)
组成
doublewrite buffer
2MB
物理磁盘上共享空间中连续的128个页
原理
先将脏页辅助到内存中单doublewrite buffer中
流程图
自适应哈希索引
优点
访问速度极快
不能顺序访问
构造条件
1.以一个同样的查询条件查询了100次
异步IO
IO Merge
可以将多个IO合并为一次IO
异步方式读取
刷新邻接页
可以通过参数关闭开启
预读
体系结构
后台线程
Master Thread
核心线程
主循环
每秒操作
日志缓冲刷新到磁盘(总是)
合并插入缓冲(可能)
至多刷新100个缓冲池中的脏页到磁盘(可能)
每十秒操作
刷新100个脏页到磁盘
合并至多五个插入缓冲
将日志文件刷新到磁盘
删除无用的undo页
刷新100个或10个脏页到磁盘
后台循环
合并20个插入缓冲
跳回主循环
刷新循环
将缓冲区数据刷新异步刷新到磁盘
脏页刷新
undo页的回收
IO Thread
使用AIO处理IO请求
Purge Thread
回收已经使用并分配的undo页
1.1版本之后purge操作独立到Purge Thread中完成
Page Clean Thread
内存
缓冲池
数据页
索引页
插入缓冲
锁信息
数据字典信息
淘汰算法
LRU算法
加入LRU List位置可以自定义
数据成为热点的时间可以自定义
内存分配(在1.0版本之后支持压缩页)
假定分配4KB内存
1.检查4KB的unzip_LRU列表.查看是否有可用的空闲页
2.有则直接使用
3.没有则检查8KB的unzip_LRU列表
Free List
Flush List
重做日志缓冲
一般情况下数据库每一秒将重做日志缓冲刷新到日志文件中
当每个事务提交时将重做日志缓冲刷新到日志文件
额外的内存池
Checkpoint技术
解决问题
1.缩短数据库回复时间
种类
Sharp Checkpoint
Fuzzy Checkpoint
Master Thread Checkp
Flush_LRU_List_Checkpoint
Asnyc Flush Checkpoint
Dirty Page Too Much Checkpoint
脏页数量过多
索引
B+树索引
聚集索引
非聚集索引
别名
稀疏索引
辅助索引
Cardinality
表中不重复数据数量的预估值
统计方式
采样统计
具体流程
3.Cardinality的预估值为Cardinality = (P1+ P2 +....+P8)*A/8
更新策略
1.表中1/16的数据发生了改变
2.表中变化数据大于2 000 000 000次
索引优化
MRR
Multi-Range Read
ICP
Index Condition PushDown(索引下推)
在引擎层面对Where条件进行过滤
哈希算法
锁
锁的类型
共享锁
允许事务读一行数据
排它锁
允许事务删除或者更新一行数据
意向共享锁
事务想要获得一张表中某几行的共享锁
意向排它锁
事务想要获得一张表中某几行的排它锁
总结
写写不兼容
非双意向读写不兼容
一致性非锁定读
实现
通过undo段实现读取历史数据
条件
在Read Committed隔离级别下使用
读取锁定行最新的快照
在Repeatable Read隔离级别下使用
读取事务开始时的快照
一致性锁定读
Select ... for update
对读取行记录加X锁
Select ... lock in share mode
对读取行记录加S锁
自增长与锁
锁的算法
行锁的三种算法
Record Lock
单个行上的锁
Gap Lock
Next-Key Lock
Gap + Record
技术:Next-Key Locking
用于解决幻读问题
在唯一索引的情况下降级为Record Lock
锁的问题
脏读
读到别的事务中没有提交的数据
幻读
丢失更新
一个事务的更新操作会被另一个事务覆盖
解决方法
使用Select ... for update(即加X锁)
事务
ACID
原子性
数据库事务是不可分割的工作单位
一致性
隔离性
事务的隔离性要求事务在提交前对另外的事务都不可见
持久性
事务分类
扁平事务
带有保存点的扁平事务
变种
链事务
只能回滚到最近一个版本
嵌套事务
分布式事务
事务的实现
redo(物理)
重做日志文件
Force Log at Commit机制
重做日志
redo log
保证事务的持久性
undo log
事务回滚以及MVCC版本控制
需要对undo log进行随机读写
log block(重做日志块)
512字节
log group(重做日志组)
逻辑概念
每个log group中的日志文件大小相同
重做日志文件总大小小于512G(InnoDB 1.2版本)
undo(逻辑)
完成的是与语句相反的工作(例如:Insert对应delete)
purge
索引的使用以及优化
MyISAM存储引擎
不支持事务
支持表锁
0 条评论
回复 删除
下一页