七、存储管理
1、存储介质
存储层次
-
存储分类
- 访问速度分类:主存储器、二级存储器、三级存储器
- 操作分类:读操作、写操作
- 联机分类:联机、脱机
- 访问方式分类:随机访问、顺序访问
- 读写单位分类:字节、块
存储介质分类
- 易失存储器
易失性存储器中的数据在计算机重新启动(关机或崩溃后)时会丢失
- 主存储器
非易失存储器
非易失性存储器中的数据在计算机重新启动时不会丢失
- 二级存储器
- 三级存储器
主存储器
使用load/store指令,主存储器中的数据可以被CPU直接操作
- 寄存器
- 高速缓存
- 内存
主存储器按字节寻址
二级存储器
二级存储器中的数据不能被CPU直接处理,必须通过读写指令先被复制到主存储器中才能被处理
- 磁盘:机械硬盘 HDD
- 闪存:固态硬盘 SSD
二级存储器是联机的、按块寻址的
三级存储器
-
三级存储器中的数据必须先被复制到二级存储器中
- 磁带
- 光盘
- 网络存储
-
三级存储器是脱机的、按块寻址的
-
访问时间
-
数据传输级别
寄存器
Register:
CPU 中的寄存器是一种高速存储器件,用于存储和操作临时的数据和指令。不同 CPU 可能会有不同数量的寄存器,且不同架构的 CPU,寄存器的功能和作用可能会有所不同。
寄存器可以根据其功能和作用分以下几种:
- 程序计数器(PC):存储当前指令地址,执行指令后会自动加一,以便 CPU 能够顺序执行下一条指令
- 累加器(ACC):用于保存运算的结果和中间值
- 数据寄存器(DR):用于存储输入和输出的数据或者临时存放一些读取到的数据
- 地址寄存器(AR):保存内存中被读取或写入的数据的地址
- 标志寄存器(FR):存储和操作一些状态标志,如进位标志、零标志、溢出标志等
- 堆栈指针寄存器(SP):保存堆栈中最后一个入栈的地址,以便维护堆栈的结构
- 指令寄存器(IR):用于保存当前正在执行的指令
缓存Cache
静态随机访问存储 SRAM
- SRAM 是 Static Random Access Memory,静态随机访问存储器
- 保存一个 bit 需要 6 个晶体管,造价高
- SRAM 一般只有几个 MB 而已,再多了就不划算
- 从电路图可以看出,基本都是一些晶体管运算,速度很快
- S RAM 一般用来做高速缓存存储器
- SRAM 通常放在 CPU 芯片上
内存
机械硬盘 HDD(Hard Disk Drive)
动态随机访问存储 DRAM
- DRAM 是 Dynamic Random Access Memory,动态随机访问存储器
- DRAM 将每个比特存储在一个电容中
- DRAM 中的电容,其中储存的电荷会在几毫秒内流失
- 所以 DRAM 需要周期性刷新电容,所以被称为动态
- 因为只用到一个晶体管,所以成本低
- 刷新过程是在 DRAM 芯片内部完成的
- 不占用总线带宽或 CPU 时间
- 通常的刷新频率为 64ms 或者更短
- 以确保 DRAM 中的数据得到充分地保护且可靠读取
- 因需要刷新所以速度比 SRAM 慢
磁盘
磁盘有两个组成部分
- 磁盘组件:sectors(扇区) tracks(磁道) cylinders(柱面)
- 磁头组件:disk heads(磁头),disk arms(磁鼻)
扇区
磁盘的每个磁道都被分成更小的扇区
- 将一个磁道分成扇区的方式已经硬编码在磁盘表面上,无法更改
扇区的组织方式
- 方法1:扇区间距固定角度
- 方法2:扇区保持均匀的记录密度
磁盘块/页
操作系统在磁盘格式化期间将一个磁道分成相等大小的磁盘块(或页)
- 一个磁盘块的大小可以设置为扇区大小的倍数
- 磁盘块的大小在磁盘格式化期间固定,不能动态改变
- 典型的磁盘块大小为 512B - 4KB
读写速率
磁盘访问时间的三个重要参数
- 平均寻道时间
- 平均延迟时间,取决于磁盘转速 7200 转 / 分钟
- 数据传输速率
- 磁盘访问方式
- 顺序访问
- 随机访问
闪存 Flash memory
闪存是一种非易失性存储器,也称为固态存储器,具有以下特点:
- 高速读写:闪存的读写速度比机械硬盘快,因为它是通过电子信号进行读写操作
- 耐用:闪存具有较长的使用寿命,并且不容易受到外界的磁场和震动的影响
- 体积小:闪存的内部结构比机械硬盘短小精悍,因其尺寸小,适合于小型电子设备
- 低功耗:闪存的电源消耗相对较低,非常适合移动设备和便携式电脑等应用
应用场景
- 存储卡和 USB 存储设备
- 固态硬盘
- 移动电话和平板电脑
- 数码相机
磁带
光盘CD/DVD
网络存储NAS
2、存储引擎
- 存储引擎不同,数据在磁盘上的结构不同
- 存储引擎不同,索引可能不同
- MySQL 的存储引擎是可插拔的
- MySQL 的存储引擎是基于表的
存储引擎的种类
- InnoDB 引擎
- MylSAM 引擎
- Archive 引擎
- Blackhole 引擎
- CSV 引擎
- Memory 引擎
- Federated 引擎
- Merge 引擎
- NDB 引擎
存储引擎的相关操作
- 查看 MySQL 支持的所有存储引擎
- 查看 MySQL 默认的存储引擎
- 查看某个表使用的存储引擎
- 创建表时指定存储引擎
- 修改表的存储引擎
InnoDB引擎
- InnoDB 是 MySQL 默认的存储引擎
- InnoDB 被设计用来处理大量的短期 事务
- 如表中除了增加和查询外,还需要更新和删除,则应优先选择 InnoDB 存储引擎
- 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑 InnoDB 引擎
- 对比 MyISAM 的存储引擎,InnoDB 写的处理效率差一些
- InnoDB 会占用更多的磁盘空间 以保存数据和索引
- MyISAM 只缓存索引,不缓存真实数据;InnoDB 不仅缓存索引还要缓存真实数据
- InnoDB 对内存要求较高 ,而且内存大小对性能有决定性的影响
MylSAM 引擎
- MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS) 等
- MyISAM 不支持事务 、行级锁、外键,主要缺陷是崩溃后无法安全恢复
- 优势是 访问速度快 ,对事务完整性没有要求或者 以 SELECT、INSERT 为主的应用
- 针对数据统计有额外的常数存储。故而 count( ) 的查询效率很高
- 应用场景: 只读应用或者以读为主的业务
- OLTP OnLine Transaction Processing ,联机事务处理
- OLAP OnLine Analytics Processing ,联机分析处理
Memory 引擎
- Memory 采用的逻辑介质是内存,响应速度很快
- 当 mysqld 守护进程崩溃的时候数据会丢失
- 要求存储的数据是数据长度不变的格式,如,Blob 和 Text 类型的数据不可用
- Memory 同时支持哈希索引和 B+ 树索引
- Memory 表至少比 MyISAM 表要快一个数量级
- Memory 表的大小受限制
- 数据文件与索引文件分开存储
- 缺点:其数据易丢失,生命周期短
3、存储结构
磁盘存储结构
- 表空间
- 段 segment
- 区 extent
- 页 page
- 行 row
系统表空间 /var/lib/mysql/ibdata1
用户表空间 /var/lib/mysql/db_name/tb_name.ibd
临时表空间 /var/lib/mysql/ibtmp1
行结构
行格式种类
- Compact 行格式
- Dynamic 行格式
- Compressed 行格式
- Redundant 行格式
行格式的相关操作
- 查看 MySQL 默认的行格式
- 查看某个表的行格式
- 创建表时指定行格式
- 修改表的行格式
Compact 行格式
变长字段长度列表
- 把所有变长字段真实数据占用的字节长度都存放在记录的开头
- 存储的长度和字段顺序是相反的
-
NUll值列表
- 统一管理可以为 NULL 的列,存成 NULL 值列表。如果表中没有可以为 NULL 的列,则 NULL 值列表不存在
-
- 二进制位的值为 1 时,代表该列的值为 NULL
- 二进制位的值为 0 时,代表该列的值不为 NULL
- 跟字段的顺序相反
记录头信息
真实数据
Dynamic and Compressed row format
- 行溢出
- 数据压缩
什么是行溢出?
行溢出的两种不同的处理方式
- compact 和 redundant 是一种,绿框所示,指针为 20 字节,发生溢出的页中保留部分数据和指针,剩余数据放到其他页中
- dynamic 和 compressed 是一种,红框所示,指针为 20 字节,发生溢出的页中只存放指针,所有数据放到其他页中
Redundant 行格式
页结构
页
页是 InnoDB 管理存储空间的基本单位,一个页的大小一般是 16KB。InnoDB 为了不同的目的设计了许多种不同类型的页。页是磁盘和内存数据交换的基本单位,也是 B+ 树索引节点的基本单位。
常见页的类型
- 表空间头部信息页
- Insert Buffer 页
- inode 信息页
- undo 日志页
- 索引页 (就是数据页),是记录的容器
页相关操作
- 查看MySQL默认页尺寸
索引页结构
最大记录、最小记录
文件头部结构(38字节)
文件尾部结构(8字节)
- 前4 个字节代表页的校验和这个部分与 File Header 中的校验和相对应
- 后 4 个字节代表页面被最后修改时对应的日志序列位置(LSN) 这个部分也是为了校验页的完整性,如果首部和尾部的 LSN 值校验不成功的话,就说明同步过程出现了问题。
空闲空间、用户记录
页目录结构
页头结构
表空间相关操作
- 查看系统表空间和临时表空间的路径设置
- 查看是否启用独立表空间(用户表空间)
系统表空间 /var/lib/mysql/ibdata1
用户表空间 /var/lib/mysql/db_name/tb_name.ibd
临时表空间 /var/lib/mysql/ibtmp1
B+树和页结构
因为页10最多只能放3条记录,所以我们不得不再分配一个新页
由于数据页的编号可能并不是连续的,所以在向 index_demo 表中插入许多条记录后,可能是这样的效果:
B+树的容量
- 如果 B+ 树只有 1 层,也就是只有 1 个用于存放用户记录的节点,最多能存放 100 条记录
- 如果 B+ 树有 2 层,最多能存放 1000×100=100000 条记录
- 如果 B+ 树有 3 层,最多能存放 1000×1000×100=100000000 条记录
- 如果 B+ 树有 4 层,最多能存放 1000×1000×1000×100=100000000000 条记录
- 你的表里能存放 一千亿 条记录么?所以一般情况下,B+ 树都不会超过4层,意味着找到一条记录不会超多 4 次 I/O