焱老师带你学习MYSQL系列 第二篇 (MYSQL 数据结构)
相关系列链接
焱老师带你学习MYSQL系列 第六篇 (MYSQL是如何实现锁的)
焱老师带你学习MYSQL系列 第五篇 (MYSQL事务隔离级别是如何实现的)
焱老师带你学习MYSQL系列 第四篇 (MYSQL优化器详解)
焱老师带你学习MYSQL系列 第三篇 (MYSQL单表访问方法)
焱老师带你学习MYSQL系列 第二篇 (MYSQL 数据结构)
焱老师带你学习MYSQL系列 第一篇 (MYSQL 整体架构)
前记
有一天小明问焱老师 , 焱老师 为啥MYSQL是怎么存储那么多数据的呢 ? 是怎么存放的 ?
看着满脸疑惑的小明 焱老师陷入了沉思 !!!
1 . MYSQL 存储方式
MYSQL 存储方式是基于磁盘存储 , 区别于redis 基于内存存储 是可持久化 并且在应对一些极端情况能保证数据的完成性 .
2 . MYSQL 文件格式
上图上图 :
MYSQL 存储结构 从大到小 排列一次是 :
库 - >表空间(tablespace) - > 组 -> 段 (segment) -> 区 (extent) -> 页 (page) -> row (行)
2 . 0 库
当我们创建库时 , 会在数据目录下创建一个与数据库同名的子目录/文件夹 , 在该子目录下创建一个名为db.opt文件 . 包含了这个数据库的属性 , 比如字符集/比较规则等等 .
2 . 1 表结构
表结构的定义 . 每当我们建一个表时 , 都会在对应的目录下创建 一个 表名.frm文件来存放这个表结构的信息(二进制)
2 . 2 表空间
表空间按照属性不同分为两类 .
2 . 2 . 1 系统表空间
文件名称为ibdata1 (自适应扩大大小的)
2 . 2 . 2 独立表空间
每当MYSQL 创建一个表 , 就会在MYSQL 对应的data目录下 创建对应表的.ibd文件 . 举例子 比如表名叫table_a , 就会创建 table_a.ibd 文件 . 这个文件里面会存储所有的数据 以及这个表的索引 .
问 : 如何查看数据目录 ?
SHOW VARIABLES LIKE ‘datadir’
2 . 3 组
每 256个区为一组 每一组前三个页是固定的 页的类型分别为 FIL_PAGE_TYPE_FSP_HDR (表空间头部信息) , FIL_PAGE_IBUF_BITMAP (ChangeBuffer的一些属性) , FIL_PAGE_INODE (存储段的信息) 区 跟页的定义以及类型会在后面详细描述
2 . 4 段
段的作用 : 解决 聚簇索引 / 非聚簇索引 引起的大量随机I/O
段是一个虚化概念 . 并不是真实存在的 . 段可能是区 也可能是页 根据数据量来划分 .
针对范围查找 很多情况是找到根节点一直往后扫描 .
故我们把叶子节点 放在一个段内 , 非叶子节点放在另外一个段内 . 减少随机I/O
2 . 5 区
连续的64个页为一个区 , 区为1MB
区的分类 :
1 . 空闲区 (FREE)
2 . 有剩余空间页面的碎片区 (FREE_FRAG)
3 . 没有剩余空间页面的碎片区 (FULL_FRAG)
4 . 附属于某个段的区 (FSEG)
区与区之间是通过链表连接 .
(由于篇幅关系 焱老师 先不详细将区 的分类以及作用 , 区是如何管理以及对应区的作用 大家可以关注我 如果时间允许 我会在这个博文中详细讲解 区是如何管理以及对应的数据结构)
2 . 6 页
1 . 一页为 16KB
页的数据结构 :
无论什么页都是 FileHeader 开头 (38字节 确定当前页的属性)
每一个页都有一个页号 , 是FIL_PAGE_OFFEST , 可以通过该页号快速定位一个页
针对数据页可以组成链表 , 链表两个页面可以不连续 , 通过PERV跟NEXT组成双向链表
页的分类 :
1 . FIL_PAGE_TYPE_ALLOCATED - 最新分配 , 还未使用
2 . FIL_PAGE_UNDO_LOG - undo日志页
3 . FIL_PAGE_INODE - 存储段的信息
4 . FIL_PAGE_IBUF_FREE_LIST - ChangeBuffer空闲列表
5 . FIL_PAGE_IBUF_BITMAP - ChangeBuffer的一些属性
6 . FIL_PAGE_TYPE_SYS - 存储一些系统数据
7 . FIL_PAGE_TYPE_TRX_SYS - 事务系统数据
8 . FIL_PAGE_TYPE_FSP_HDR - 表空间头部信息
9 . FIL_PAGE_TYPE_XDES - 存储区的一些属性
10 . FIL_PAGE_TYPE_BLOB - 溢出页
11 . FIL_PAGE_INDEX - 索引页 , 也就是我们说的数据页
2 . 7 行
!!! 上面内容大家可以简单有个印象 就好 针对开发而言 掌握优先级不是很高 , 但行格式是很重要的 !!!
需要掌握
行格式数据结构 :
简单介绍 :
1 . 变长列表 (倒序排列)
是MYSQL针对每个可能为null的字段 设置一个变长字段字节数 (可能占一个字节 or 2个字节)
计算规则 :
W ; 值得是当前字符集一个字符最大的字节数 比如utf-8mb4 为 4字节
M : 当前可变字段能容纳的最大字符数 比如varchar(10) 为 10
L : 为实际字段内容存储的字节数
(当当前变长字段为null 时 , 不记录在这个列表里面)
当 : M * W <=255时 , 使用一个字节代表变长字节数
M * W>255时 :
当L <=127 时 , 使用一个字节 .
当L > 127时 , 使用两个字节 .
!!! 所以在我们设计字段时 应该尽量保证 不超过 255个字节 .
2 . NULL值列表 (倒序排列)
统计可以那些字段可以为null (not null字段类型不记录) 用2进制倒序排列 1 为null 0位非null.
3 . 记录头信息(5字节 40bit位) (固定大小)
预留字段1 - 1 bit
预留字段2 - 1 bit
deleted_flag - 1 bit (标记此记录有没有删除)
min_rec_flag - 1 bit (B+树的每层非叶子结点中最小的目录项记录会添加标记)
n_owned - 4 bit (一个页面会分组 , 该字段表示组内带头大哥 , 大哥会记录组内有多少小弟 , 小弟此值为0)
heap_no - 13 bit (当前记录在页中的相对位置)
record_type - 3 bit (0 - 普通记录
1 - 表示b+树飞叶子节点的目录项
2 - 表示Infimum记录
3 - Supremum记录 )
next_record - 16 bits (下一条记录的相对位置)
4 . 隐藏列
row_id (6字节 - 行id 唯一表示符)
trx_id (6字节 - 事务id )
roll_pointer (7字节 - 回滚指针 指向的是undo日志)
焱老师带你学习MYSQL系列 第二篇 (MYSQL 数据结构)相关推荐
- 小白学习Flink系列--第二篇-01(流式数据概念)
导读 要想彻底理解Flink,就要了解流数据的前世今生,流数据的语义.特点,以及如何处理,以下文章就能很好的解释流数据的概念和模型,对了解Flink有很大的帮助 前言 今天流式数据处理在大数据领域是一 ...
- 常老师带你学习ASP.NET MVC视频教程-常慧勇-专题视频课程
常老师带你学习ASP.NET MVC视频教程-18854人已学习 课程介绍 ASP.NET MVC视频培训课程由常老师原创,系统讲解流行ASP.NE MVC框架,大型企业项目框架开发技 ...
- 奋斗的小孩系列 FPGA学习altera系列: FPGA学习altera 系列 第二十一篇 数码管设计
奋斗的小孩系列 FPGA学习altera系列: FPGA学习altera 系列 第二十一篇 数码管设计 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是 ...
- 小强软件测试_小强老师零基础学习软件测试视频教程 理论篇+自动化篇+工具篇+实战等零基础课程...
小强老师零基础学习软件测试视频教程 理论篇+自动化篇+工具篇+实战等零基础课程 1.jpg (53.32 KB, 下载次数: 0) 2017-10-5 09:33 上传 2.jpg (49.08 KB ...
- 深入理解javascript函数系列第二篇——函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...
- mysql主从复制中间件_linux下mysql主从复制(第二篇读写分离) mycat 中间件
linux下mysql主从复制(第二篇读写分离) mycat 中间件 接着上篇文档补全,mysql 读写分离,在上篇文章案例下准备好Mycat-server-1.4-release-201510192 ...
- 小白学习Flink系列--第一篇(知识图谱)
小白学习Flink系列–第一篇(知识图谱) 如何学习Flink? 对于一门计算机技术来说,如何快速学习上手呢?具体的逻辑是什么呢?我认为有以下几条 了解技术的应用场景 技术的基本概念,如何使用,以 ...
- 前端工程师技能之photoshop巧用系列第二篇——测量篇
前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇--测量篇 测量信息 在网页制作中需要使用photoshop测量的信息分为两类,分别是尺寸信息和颜色信 ...
- [游戏开发]Python打表工具系列 [第二篇] [打表流程描简述]
[上一篇链接] [游戏开发]Python打表工具系列 [第一篇][IDE开发环境部署] VSCode Python环境调试_Little丶Seven的博客-CSDN博客 [前言] 第二篇文章是对流程的 ...
最新文章
- OFDM专题之输入的复信号从何而来?
- YTU 3004: 栈的基本运算(栈和队列)
- 成功解决ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。backend_agg.cp36
- MoeCTF 2021Re部分------大佬请喝咖啡,A_game
- mysql数据库操作指令汇总
- mysql udb_将Uhost上的MySQL迁移到UDB
- Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
- 苹果公司的企业文化_百度、苹果、脉脉等互联网大厂的企业文化衫还能这么潮?...
- 开源社区团购微商城小程序,直播
- 新模型SkipNet在ImageNet分类任务大放光彩!优化损失函数!
- printf 重新实现put_Go 实现海量日志收集系统(四)
- WPF 从文件加载字体
- Python2.7.3 Tkinter Entry(文本框) 说明
- Android控件开发之Gallery3D酷炫效果(带源码)
- UEFI开发,记录第一场胜利——调用一个自己编写的protocol
- Tukey‘s test方法 异常值
- 仿新浪微博返回顶部的js实现(jQuery/MooTools)
- MS2108 RGB转USB 数字视频采集芯片 支持8bit/16bit BT601/BT709/BT656/ BT1120转USB2.0
- 不同类型怎么选择服务器
- android应用开发入门