下次面试我一定问:MySql数据是如何存储在磁盘上存储的?
Hollis
共 6004字,需浏览 13分钟
· 2021-01-26
server层格式:与存储引擎无关,Binlog存储常用的一种 (Bin Log 我们前面已经详细介绍过了,这个是MySql主从复制的一个很重要的文件) 索引元组格式:InnoDB存取过程记录的中间状态,是InnoDB在内存中存储的格式 (换句话说我们的增删改的操作都是在内存中执行的,这个只是一种临时状态) 物理存储格式:记录在物理页面中的存储格式,即compact格式,与索引元组格式一一对应。(这个是数据在磁盘存储的真正的格式)
SHOW TABLE STATUS
查看到行的的存储格式。varchar
为例,假设现在三个字段,字段类型分别为:varchar(10),char(1),char(1)
,char
大家都是知道的,存储的基本是一些已知的长度固定的数据,假设这三个类型的字段分别有如下的数据:mysql
a
a
;第二行:dog
b
c
;画个图来帮助大家想象,现在你看到的是数据中为我们展现的样子。mysql
a
a
dog
b
c
,他们在磁盘中都是挨在一起存储的。MySql
在设计的时候才会使用行格式存储,才会有前面的哪些变长字段列表和标志位以及记录信息,这些就是用来记录一行的记录的信息,换句话说,MySql
是通过这些描述信息来定位到一行中的具体记录的。MySql
是很清楚的,在这个基础上我们能看明白下面和想通后面的事情。首先我们看到 mysql
是5个字符,使用十六进制表示是 0x05,所以他的存储大概是这样子的:MySql
这个时候是怎么读读取数据的了,就是他会先根据变长字段长度列表中描述的变长字段的信息去查找变长字段,例如第一行,MySql
解析到变长字段是5,所以他会在mysql
a
a
dog
b
c
这些里面取出5个字符,也就是 mysql
,紧接着后面是两个 char(1) 也就是两个 a
在依次取出来。中间设备。由浅入深,我们慢慢来,刚刚上面说到的仅仅是一种非常简单的情况,这个首先是帮助大家理解,让大家先明白有这么个回事,是这么回事,然后在慢慢的挖掘,我们一定要一个萝卜一个坑的去踏实学习
varchar
类型的字段怎么办?例如:varchar(3),varchar(10),varchar(4),char(1)
,他有一条记录是这样子的:aaa
,bb
,cccc
,d
,你根据上面的能推测出磁盘中的行记录是怎么样子的吗?0x03,0x02,0x04
null标志位 记录头信息 aaa
bb
cccc
d
;这么想的同学请鼻子靠墙:);实际上并不是这样子的。MySql
在 compact 行格式中,把所有变长类型的长度存放在行记录的开头部位形成一个列表(这个列表就是刚刚上面说的变长字段列表),按照列的逆序存放,也就是大致是这样子的:next_record
指针 指向下一行 记录头信息
和 真实数据
之间的位置。因为这个位置刚刚好,向左读取就是行描述相关信息,向右读取就是真实数据。正好对应变长字段长度列表。画个图来帮助大家理解下:数据在磁盘中的存储在物理空间上面是连续的 数据是被存放在MySql设计出来的数据页上面的,数据页上面存储的才是最终的一行一行的记录 行的存储格式默认是Compact 每一行数据都会有相应的行描述部分,描述部分有【变长字段列表】【NULL标志位】【记录头信息】 每一行都会有next_record指针,指向记录头和变长字段列表的中间某个位置,方便寻址 变长列表中的varchar列的描述是逆序的(和字段的顺序相反)这样做的目的在上图中描述的很清楚了
MySql
又是怎么处理的呢?是不是直接存储NULL呢。MySql
针对与Null直接存储,他实际上是按照“NULL”这样字符串的形式存储的,这样显然不行啊,因为字符串要占用空间的啊(一个 NULL 字符串要占用四个字符呢),你都没有值,还占这么多空间,所以MySql
肯定不是这样存储的。其实MySql
在处理NULL值的时候是会将它通二进制来存储的,且也是逆序的CREATE TABLE `students` (
`name` varchar(10) NOT NULL,
`address` varchar(255) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`class` varchar(10) DEFAULT NULL,
`hobbies` varchar(255) DEFAULT NULL,
PRIMARY KEY (`name`)
)
0x08 0x05
name字段是主键,不可能在NULL 标志位中的,又因为 name 是varchar 字段,所以就会去变长字段列中查找,找到值为 0x05 接着就会去字段列表中读取5个字符的长度,也就是 roles ,第一个字段读取成功; 接着是 address 字段,因为类型是 MySql 已知的,又因为字段值为 null 所以就不需要去读取了,第二个字段读取结束; 接着是gender字段,是char类型的,直接拿到 f 就可以了; 下一个是class 字段,因为是null 所以根本不会去变长字段中查找; 最后一个是 hobbies 字段,因为不为null ,又是第二个变长字段,这个时候就会去 变长字段列表中查找,结果定位到是 0x08 那就读取 8 个字符的长度出来,拿出来是hobby_xx;
0x08 0x05
00000101
0000010100000000000000000000000000000010
21134
44
232343
所以你在使用和了解的使用只需要按照被人的规则来执行,然后在此基础上深入了解下别人为什么这么设计?这样会更有助于我们掌握和理解某个知识点。
往期推荐
特普朗任期最后一天特赦了一位硅谷工程师,免去牢狱之灾和2亿美金赔款
郑爽和张恒纠纷的前因后果:一个APP引发的血案
被读者投诉抄袭了!?
直面Java第343期:为什么TOMCAT要破坏双亲委派
深入并发第013期:拓展synchronized——锁优化
评论
以数字化转型赋能新型工业化的行业路径:装备制造|以数字化转型赋能新型工业化系列谈(十)
编者按习近平总书记指出,“新时代新征程,以中国式现代化全面推进强国建设、民族复兴伟业,实现新型工业化是关键任务”。为贯彻落实习近平总书记对推进新型工业化作出的重要指示和全国新型工业化推进大会精神,在“赛迪问道数字转型”的研究基础上,赛迪研究院信软所数字化转型课题组聚焦“以数字化转型赋能新型工业化”主
工业互联网世界
0
中华人民共和国和法兰西共和国关于人工智能和全球治理的联合声明
中国邀请法国参加2024世界人工智能大会暨人工智能全球治理高级别会议。冲击万店,汉堡界能跑出下一个蜜雪冰城吗?应法兰西共和国总统埃马纽埃尔·马克龙邀请,中华人民共和国主席习近平于2024年5月5日至7日对法国进行国事访问。在两国建交60周年之际,两国元首重申共同致力于深化2023年4月5日至7日法兰
亿欧网
0
中枪的怎么又是百度?
文 | 阑夕以前说到百度这家公司的槽点,主要还是「上有所好,下必甚焉」的问题,老板想要什么,底下的人就汇报什么,最后把老板骗出去丢人。但是百度公关副总裁接连几天的神操作,又给出了卧龙之外的凤雏答案,那就是老板好像也没做错什么,但经不住管理团队里有人偏要「造」。懈怠的错误和勤奋的愚蠢,就像是屎味的巧克
阑夕
7
接班张勇,46岁的她逆势翻盘
双手改变命运不是口号,而是真实发生的。冲击万店,汉堡界能跑出下一个蜜雪冰城吗?回到29年前,17岁的杨利娟不会想到,挖她跳槽的那家叫“海什么”的火锅店,有朝一日会成为中国最大的连锁火锅品牌。而由于家境困难早早辍学、背了一身债的她,日后会成为管理十几万员工的海底捞首席执行官。听上去,这是一部大女主“升
亿欧网
0
低空经济20人|亿维特任文广:空中出行的梦想实现家
近日,亿维特(南京)航空科技有限公司自主研制的电动垂直起降飞机(eVTOL)ET9原型机成功完成首飞。本期“低空经济20人”系列邀请亿维特创始人、董事长任文广,分享ET9的技术特点及对先进空中交通(AAM)行业的思考和见解。(eVTOL,全称是electric Vertical Take-off a
亿欧网
0
伴学周签 | 什么是阿里人常说的铁军精神 ?
每周一问,共同学习关于茅庐学堂茅庐学堂总结提炼了阿里24年战略落地、组织升级、企业管理和干部培养的实践精华,并结合8年来服务超过300家行业TOP企业的实践打磨,为成长型企业战略落地组织升级提供定制式陪伴咨询服务。想要深入了解茅庐学堂服务欢迎添加学长微信或致电15394275373
茅庐学堂
0
以数字化转型赋能新型工业化的行业路径:原材料 | 以数字化转型赋能新型工业化系列谈(九)
编者按习近平总书记指出,“新时代新征程,以中国式现代化全面推进强国建设、民族复兴伟业,实现新型工业化是关键任务”。为贯彻落实习近平总书记对推进新型工业化作出的重要指示和全国新型工业化推进大会精神,在“赛迪问道数字转型”的研究基础上,赛迪研究院信软所数字化转型课题组聚焦“以数字化转型赋能新型工业化”主
工业互联网世界
0