| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> MySQL设计与实践学习笔记(一) -> 正文阅读 |
|
[数据结构与算法]MySQL设计与实践学习笔记(一) |
MySQL架构体系设计深入剖析
架构:平衡能力
一、MySQL InnoDB存储引擎原理拆解以及设计深度剖析
? ? ? ? 1、数据组织
????????????????MySQL记录存储以Page(页)来划分
????????????????每个数据页的大小为16KB
? ? ? ? 2、页内记录维护?
????????????????收缩 删除从 主->从 删除主 从->主?
?
二、MySQL InnoDB存储引擎内存管理
????????1、InnoDB内存管理 ? ? ?
???? ???? ???? ???? ???? ?MySQL解决:
????????????????????????????????Buffer Pool: 预分配内存池
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Page: Buffer Pool的最小单位
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Free list : 空闲page组成的链表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Flush list :脏页列表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Page hash表: 维护内存Page和文件Page的映射关系
? ? ? ? ? ? ? ? ? ? ? ? ? ??????LRU?:?内存淘汰算法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?页面装载:磁盘数据到内存
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?页面淘汰:LRU尾部淘汰、Flush LRU淘汰?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Free list中取 > LRU中淘汰 > LRU Flush
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? flush - LRU tail - free list - 读disk - LRU_old
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?位置移动:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?old到new 移动时机:innodb_old_blocks_time old区存活时间大于此值有机会进入new区
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?new到old:Midpoint始终指向? 5/8位置
? ????? ???? ???? ???? ????? ? ??? ??LRU_new的操作:lock 问题 减少移动的次数?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?freed_page_clock:Buffer pool 淘汰页数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LRU_new 长度 1/4
???? ???? ???? ???? ???? ???? ???? ????? ? ?当前?freed_page_clock -上次移动到headers时?freed_page_clock ????????????????????????????????????????????????????????????????????????>??LRU_new 长度 1/4 比较
三、MySQL锁实现原理拆解以及设计深度剖析
? ? 1、锁粒度
???? ? ? 行级锁: 作用在索引上? ?聚簇索引& 二级索引? 唯一索引/非唯一索引* RR/RC??
???? ? ? 间隙锁:解决可重复读模式下的幻读问题、GAP锁不是加在记录上、GPA锁住的位置是两条记录之间的GAP、保证两次当前读返回一致的记录? ?两次当前读期间其他的事务不会插入新的满足条件的记录
???? ? ? 表级锁:lock tables 元数据锁(meta data lock,MDL)? 全表扫描“表锁” 所有记录加锁后返回,由MYSQL server层过滤 一条一条加锁
? ? ?2、类型
???? ? ? 共享锁S:读锁 可同时被多个事务获取,阻止其他事务对记录的修改
???? ? ? 排他锁X:写锁 只能被一个事务获取,允许获得锁的事务修改记录
???? ????
所有当前读加排他锁: SELECT FOR UPDATE、 UPDATE、 DELETE
????
四、MySQL事务实现原理拆解以及设计深度剖析
?????????1、事务特性 ????????????????原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。全部成功或全部失败 ????????????????隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。并行事务之间互不干扰 ????????????????持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。事务提交后永久生效???????????????? ????????????????一致性(Consistency)事务前后数据的完整性必须保持一致。通过AID保证。
????????2、并发问题
????????????????脏读(Dirty Read):读取到未提交的数据
???? ? ? ???????不可重复读(Non-repeatable Read):两次读取结果不同
???? ? ? ???????幻读(Phantom Read):select操作得到的结果表征的数据状态无法支撑后续的业务操作
? ? ? ? 3、隔离级别
? ? ? ? ? ? ? ? ?Read Uncommitted(读未提交):最低隔离级别,会读取到其他事务未提交的数据 产生脏读问题
???? ? ? ????????Read Committed(读已提交):事务过程中可以读取到其他事务已提交的数据 不可重复读问题
? ? ? ? ? ? ? ? ?Repeatable Read(可重复读):每次读取相同结果集,不管其他事务是否提交 幻读问题
? ? ? ? ? ? ? ? ?Serializable(串行化):事务排队,隔离级别最高,性能最差 不能用
? ? ? ? 4、事务实现原理
???? ????
???? ? ? ????????MVCC:多版本并发控制 解决读写冲突 隐藏列(事务ID 回滚指针)
???? ???? ???? ????? ? ?当前读? 快照读
? ? ? ? ? ? ? ? ? ?MVCC实现 RR 可重服读
???? ???? ????? ? ?可见性判断:创建快照这一刻还未提交的事务×? 创建快照之后创建的事务 ×
???? ???? ????? ? ?Read View: 快照读 活跃事务列表、列表中最小事务ID、列表中最大事务ID
? ? ? ? ? ? ? ?undo log(如何清理:依据系统活跃的最小事务ID Read view)
???? ????? ? ??????????回滚日志、保证事务原子性、实现数据多版本、delete undo log:用于回滚,提交即清理、update undo log:用于回滚,同时实现快照读,不能随便删除
???? ??? ??????redo log?
???? ??? ? ? ?????????实现事务持久性
???? ??? ? ? ???????????????记录修改
????????????????????????????用于异常恢复
????????????????????????????循环写文件: write pos 写入位置? check point 刷盘位置?
Check Point -> Write pos: 待落盘数
???? ??? ? ? ?????????写入流程: 记录页的修改 状态为prepage 事务提交,将事务记录为commit状态
???? ????? ? ?????????刷盘时机:innodb_flush_log_at_trx_commit? 2
???? ????? ? ??????????意义:1、体积小,记录页的修改,比写入页代价低? ? ?2、末尾追加,随机写变顺序写,发生改变的页不固定
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:55:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |