IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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
  1. 页头:56个字节 记录页面的控制信息 包括页的左右兄弟页面指针、页面空间使用情况 双相链表
  2. 虚记录:最小虚记录:比页内最小主键还小 最大虚记录:比页内最大主键还大
  3. 记录堆:行记录存储区,包括有效记录和已删除记录两种
  4. 自由空间链表:链表关联被删除的记录用来重复利用空间 删除使用逻辑删除
  5. 未分配空间:页面未使用的存储空间
  6. Slot区:多条记录对应一个槽,而槽的作用就是用来在页面内进行数据搜索的,因为查找一条数据时,是用B+tree来保证通过树形结构找到一个记录所在的页,而在页内部真正找到这条记录是通过槽来完成的。
  7. 页尾:8个字节 主要存储页面的校验信息

? ? ? ? 2、页内记录维护?

  1. 顺序保障:
    1. 物理有序:数组(二分查找,读快,写慢)
    2. 逻辑有序:链表(便利查找,读慢,写快) √?

  1. 插入策略?
    1. 自由空间链表??
    2. 未使用空间 ?
????????????????收缩 删除从 主->从 删除主 从->主?
?
  1. 页内查询 跳表
    1. 遍历(逻辑有序)
    2. 二分查找(物理有序):
      ? ? ? ? 但是二分查找的话,因为每条记录是不一样的大小,所以不能根据size去二分查找。所以不论是逻辑有序还是物理有序都不可以用二分查找。
      ? ? ? ??所以有了 SLOT 槽。根据页内设置槽的数量和大小,每个slot指向一个记录。Slot是一堆连续的内存,把整个链表根据slot数量拆分为多个sub-list。每个slot指向一个记录即每个sub-list的头 。Slot同来帮助我们实现一个近似的二分查找。????????
      ? ? ? ??Mysql的页内查询就是 用Slot来存放分链表,二分查找Slot,锁定部分数据,再对该部分数据进行遍历查找。


二、MySQL InnoDB存储引擎内存管理
????????1、InnoDB内存管理 ? ? ?
  1. 预分配内存空间
  2. 数据加载单元? ? ?需要数据往内存加载
  3. 数据内外存转换? ? ?向内存加载新数据,淘汰旧数据加载新数据
  4. 内存池
  5. 内存页面管理:空闲页、数据页、脏页
    1. ?映射关系维护
    2. ?页面数据管理
  6. 数据淘汰:LRU(最久没被使用的页淘汰掉)? ?预热:内存放热门数据,访问频繁数据
    1. 内存页都被使用,需要加载新数据
    2. 避免热数据被淘汰:访问时间+频率? ?两个LRU表 一个热表 一个冷表


???? ???? ???? ???? ???? ?MySQL解决:
????????????????????????????????Buffer Pool: 预分配内存池
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Page: Buffer Pool的最小单位
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Free list : 空闲page组成的链表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Flush list :脏页列表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Page hash表: 维护内存Page和文件Page的映射关系
? ? ? ? ? ? ? ? ? ? ? ? ? ??????LRU?:?内存淘汰算法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?


????????????????????????????????????????LRU_new 5/8????????LRU_old? ?3/8????????Midpoint? 5/8位置

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?页面装载:磁盘数据到内存

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?页面淘汰: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、末尾追加,随机写变顺序写,发生改变的页不固定
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-14 22:24:23  更:2021-10-14 22:24:28 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码